我希望以编程方式从VBA冻结Excel工作表的第一行。最终目标是产生与Excel 2007中的View > Freeze Panes > Freeze Top Row
命令相同的效果,以便冻结工作表的顶行,并且用户即使在滚动数据时也可以看到工作表的顶行。
答案 0 :(得分:39)
Rows("2:2").Select
ActiveWindow.FreezePanes = True
为不同的效果选择不同的范围,与手动操作的方式非常相似。 “Freeze Top Row”实际上只是Excel 2007(及以上版本)中的一个新快捷方式,与早期版本的Excel相比,它不包含任何附加功能。
答案 1 :(得分:17)
Tomalak已经给你一个正确的答案,但是我想补充一点,当你想知道在用户界面中做某个动作所需的VBA代码时,记录一个宏是个好主意。
在这种情况下,在功能区的开发人员选项卡上单击录制宏,冻结顶行然后停止录制。 Excel将为您记录下面的宏,它也可以完成这项工作:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
答案 2 :(得分: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
答案 3 :(得分:8)
刚刚遇到同样的问题...... 出于某种原因,freezepanes命令只是使十字准线出现在屏幕的中心。结果我关掉了ScreenUpdating! 解决了以下代码:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
现在工作正常。
答案 4 :(得分:6)
将此问题扩展到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,但它应该可以直接转录到其他语言和平台。
答案 5 :(得分:3)
Rows("2:2").Select
ActiveWindow.FreezePanes = True
This is the easiest way to freeze the top row. The rule for FreezePanes
is it will freeze the upper left corner from the cell you selected. For example, if you highlight C10, it will freeze between columns B and C, rows 9 and 10. So when you highlight Row 2, it actually freeze between Rows 1 and 2 which is the top row.
Also, the .SplitColumn
or .SplitRow
will split your window once you unfreeze it which is not the way I like.