2010-07-12 281 views

回答

30
Rows("2:2").Select 
ActiveWindow.FreezePanes = True 

为不同的效果选择不同的范围,这与您手动操作的方式非常相似。 “Freeze Top Row”实际上是Excel 2007(及更高版本)中的一项新增功能,与早期版本的Excel相比,它不包含任何附加功能。

+5

似乎像ScreenUpdating必须在此工作,但否则很好。谢谢! – 2010-07-12 23:25:20

+2

我不清楚如何通过选择顶行来冻结最上面的一行。要冻结最上一行,选择应该是'行(2)'或'行(“2:2”)'。选择“行”(“1:1”)会导致工作表的四象限分割。 – Jeeped 2015-07-29 15:10:26

+0

@Jeeped m) - 当然!好的发现,谢谢! – Tomalak 2015-07-29 15:12:07

12

Tomalak已经给了你一个正确的答案,但是我想补充一点,当你想知道在用户界面中做某个动作所需的VBA代码时,最好记录一个宏。

在这种情况下,请在功能区的开发人员选项卡上单击记录宏,冻结最上一行然后停止记录。 Excel将有记录,你下面的宏也不会工作:

With ActiveWindow 
    .SplitColumn = 0 
    .SplitRow = 1 
End With 
ActiveWindow.FreezePanes = True 
+0

是的。这是正确的答案。无需选择工作表的任何部分。 – HuckIt 2015-02-03 16:58:33

+0

好的答案,但我很好奇为什么最后的声明没有塞进With ... End With语句。 – Jeeped 2015-07-29 14:32:07

+0

@Jeeped:这只是Excel宏记录器的原始输出。当然,你可以在“With”块中包含该行。 – 2015-07-29 15:51:56

13

与录制宏的问题是相同的,与内置的动作问题:Excel中选择冻顶可见行,而不是可以找到标题信息的实际顶行。

在这种情况下宏的目的是冻结实际的顶行。当我正在查看第405592行时,我需要检查列的标题(因为我在打开文件时忘记冻结行),所以我必须滚动到顶部,冻结第一行,然后找到返回的路再次行#405592。既然我认为这是愚蠢的行为,我想要一个宏来纠正它,但正如我所说,录制的宏只是模仿了同样愚蠢的行为。

我使用Office 2011的Mac OS X Lion的

更新(2分钟后):

我发现这里的解决方案:http://www.ozgrid.com/forum/showthread.php?t=19692

Dim r As Range 
Set r = ActiveCell 
Range("A2").Select 
With ActiveWindow 
    .FreezePanes = False 
    .ScrollRow = 1 
    .ScrollColumn = 1 
    .FreezePanes = True 
    .ScrollRow = r.Row 
End With 
r.Select 
+2

对于像我这样的其他新手:我可以通过设置范围(“A9”)而不改变其他任何东西来冻结前8行(我的报告“仪表板”所在的位置)。 – Sean 2013-10-24 23:30:54

7

只要按同样的问题.. 。 出于某种原因,freezepanes命令只是导致十字线出现在屏幕的中心。它变成了我关掉ScreenUpdating的功能! 用以下代码解决:

Application.ScreenUpdating = True 
Cells(2, 1).Select 
ActiveWindow.FreezePanes = True 

现在它工作正常。

2
Rows("2:2").Select 
ActiveWindow.FreezePanes = True 

这是冻结第一行的最简单方法。 FreezePanes的规则是冻结您选择的单元格中的左上角。例如,如果突出显示C10,它将在列B和C之间的第9行和第10行之间冻结。因此,当突出显示第2行时,它实际上会冻结在第1行和第2行之间,即第一行。

而且,.SplitColumn.SplitRow会在您解冻窗口后拆分窗口,这不是我喜欢的方式。

3

要将此问题扩展到Excel 自己的VBA之外的使用领域,ActiveWindow property必须作为Excel.Application object的子代来处理。

从Access中创建一个Excel工作簿

例子:

在其他Office应用程序的VBA项目使用Excel.Application object会要求你添加的Microsoft Excel 15.0对象库(或等同于你自己的版本)。

Option Explicit 

Sub xls_Build__Report() 
    Dim xlApp As Excel.Application, ws As Worksheet, wb As Workbook 
    Dim fn As String 

    Set xlApp = CreateObject("Excel.Application") 
    xlApp.DisplayAlerts = False 
    xlApp.Visible = True 

    Set wb = xlApp.Workbooks.Add 
    With wb 
     .Sheets(1).Name = "Report" 
     With .Sheets("Report") 

      'report generation here 

     End With 

     'This is where the Freeze Pane is dealt with 
     'Freezes top row 
     With xlApp.ActiveWindow 
      .SplitColumn = 0 
      .SplitRow = 1 
      .FreezePanes = True 
     End With 

     fn = CurrentProject.Path & "\Reports\Report_" & Format(Date, "yyyymmdd") & ".xlsx" 
     If CBool(Len(Dir(fn, vbNormal))) Then Kill fn 
     .SaveAs FileName:=fn, FileFormat:=xlOpenXMLWorkbook 
    End With 

Close_and_Quit: 
    wb.Close False 
    xlApp.Quit 
End Sub 

制造过程的核心其实就是一个先前提交答案的重申,但我想证明如何处理的ActiveWindow时,你是不是Excel的VBA本身内是很重要的。虽然这里的代码是VBA,但它应该可以直接转录到其他语言和平台。

+0

你也可以使用'Set xlApp = New Excel.Application',甚至可以使用Dim xlApp As New Excel.Application'。 – 2016-10-10 15:28:00

相关问题