如何以编程方式冻结Excel 2007 VBA中Excel工作表的顶行?

LJ.*_*LJ. 39 excel vba ms-office excel-vba

我期待以编程方式从VBA冻结Excel工作表的顶行.最终目标是产生与View > Freeze Panes > Freeze Top RowExcel 2007中的命令相同的效果,以便冻结工作表的顶行,并且用户即使在滚动数据时也可以看到工作表的顶行.

Tom*_*lak 40

Rows("2:2").Select
ActiveWindow.FreezePanes = True
Run Code Online (Sandbox Code Playgroud)

为不同的效果选择不同的范围,与手动操作的方式非常相似."Freeze Top Row"实际上只是Excel 2007(及以上版本)中的一个新快捷方式,与早期版本的Excel相比,它不包含任何附加功能.

  • 似乎必须启用ScreenUpdating才能实现此功能,但其他功能非常好.谢谢! (6认同)
  • 有关更好的解决方案,请参阅[本答复](http://stackoverflow.com/a/34095034/445425) (5认同)
  • 我不清楚如何通过选择顶行来冻结顶行.要冻结顶行,选择应该是'Rows(2)`或`Rows("2:2")`.选择`Row("1:1")`会导致工作表的四象限分割. (2认同)
  • @chrisneilsen 对此表示感谢,其他答案实际上要好得多。 (2认同)

Dir*_*mar 18

Tomalak已经给你一个正确的答案,但我想补充说,大多数时候,当你想知道在用户界面中做某个动作所需的VBA代码时,记录一个宏是个好主意.

在这种情况下,单击功能区的开发人员选项卡上的" 录制宏 ",冻结顶行,然后停止录制.Excel将为您记录下面的宏,它也可以完成这项工作:

With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
End With
ActiveWindow.FreezePanes = True
Run Code Online (Sandbox Code Playgroud)

  • 是.这是正确的答案.无需选择工作表的任何部分. (2认同)
  • 很好的答案,但我很好奇为什么最后一个语句没有塞进 With ... End With 语句中。 (2认同)

Dan*_*nid 13

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

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

我正在使用Office 2011 for 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 
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样的任何其他新手:我能够通过制作范围("A9")而不更改任何其他内容来冻结前8行(我的报告"仪表板"所在的位置). (2认同)

小智 8

只是遇到同样的问题...由于某种原因,freezepanes命令只是导致十字准线出现在屏幕的中心.结果我关掉了ScreenUpdating!解决了以下代码:

Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
Run Code Online (Sandbox Code Playgroud)

现在它工作正常.


小智 6

要将此问题扩展到Excel自己的VBA之外的使用领域,必须将ActiveWindow属性作为Excel.Application对象的子项进行寻址.

从Access创建Excel工作簿的示例:

在另一个Office应用程序的VBA项目中使用Excel.Application对象将要求您添加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
Run Code Online (Sandbox Code Playgroud)

核心流程实际上只是对先前提交的答案的重复,但我认为当您不在Excel自己的VBA中时,演示如何处理ActiveWindow非常重要.虽然这里的代码是VBA,但它应该可以直接转录到其他语言和平台.