我期待以编程方式从VBA冻结Excel工作表的第一行。最终目标是产生与Excel 2007中的View > Freeze Panes > Freeze Top Row
命令相同的效果,以便冻结工作表的顶行,并且用户即使在滚动数据时也可以看到工作表的顶行。
Rows("2:2").Select
ActiveWindow.FreezePanes = True
为不同的效果选择不同的范围,与手动操作的方式非常相似。 “Freeze Top Row”实际上只是Excel 2007(及以上版本)中的一个新快捷方式,与早期版本的Excel相比,它不包含任何附加功能。
Tomalak已经给你一个正确的答案,但我想补充说,大多数时候,当你想知道在用户界面中做某个动作所需的VBA代码时,记录一个宏是个好主意。
在这种情况下,单击功能区的开发人员选项卡上的“录制宏”,冻结顶行,然后停止录制。 Excel将为您记录下面的宏,它也可以完成这项工作:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
录制的宏的问题与内置操作的问题相同: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
只是遇到同样的问题...由于某种原因,freezepanes命令只是导致十字准线出现在屏幕的中心。结果我关掉了ScreenUpdating!解决了以下代码:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
现在它工作正常。
为了将这个问题扩展到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
核心流程实际上只是对先前提交的答案的重复,但我认为当您不在Excel自己的VBA中时,演示如何处理ActiveWindow非常重要。虽然这里的代码是VBA,但它应该可以直接转录到其他语言和平台。
Rows("2:2").Select
ActiveWindow.FreezePanes = True
这是冻结顶行的最简单方法。 FreezePanes
的规则是它会冻结您选择的单元格的左上角。例如,如果突出显示C10,它将在列B和C,第9行和第10行之间冻结。因此,当您突出显示第2行时,它实际上会冻结在第1行和第2行之间,即第1行。
此外,.SplitColumn
或.SplitRow
将解冻你的窗户,这不是我喜欢的方式。