我正在寻找以编程方式从VBA冻结Excel工作表的第一行。最终目标是产生与Excel 2007中的View > Freeze Panes > Freeze Top Row
命令相同的效果,以便冻结工作表的第一行,并且即使在滚动数据时用户也可以看到工作表的第一行。如何以编程方式冻结Excel 2007 VBA中Excel工作表的首行?
回答
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的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
对于像我这样的其他新手:我可以通过设置范围(“A9”)而不改变其他任何东西来冻结前8行(我的报告“仪表板”所在的位置)。 – Sean 2013-10-24 23:30:54
只要按同样的问题.. 。 出于某种原因,freezepanes命令只是导致十字线出现在屏幕的中心。它变成了我关掉ScreenUpdating的功能! 用以下代码解决:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
现在它工作正常。
Rows("2:2").Select
ActiveWindow.FreezePanes = True
这是冻结第一行的最简单方法。 FreezePanes
的规则是冻结您选择的单元格中的左上角。例如,如果突出显示C10,它将在列B和C之间的第9行和第10行之间冻结。因此,当突出显示第2行时,它实际上会冻结在第1行和第2行之间,即第一行。
而且,.SplitColumn
或.SplitRow
会在您解冻窗口后拆分窗口,这不是我喜欢的方式。
要将此问题扩展到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,但它应该可以直接转录到其他语言和平台。
你也可以使用'Set xlApp = New Excel.Application',甚至可以使用Dim xlApp As New Excel.Application'。 – 2016-10-10 15:28:00
- 1. 如何冻结ComboBox Excel VBA
- 2. 在vba运行时冻结excel编辑
- 3. 以编程方式更改Excel工作表的行高
- 4. VBA Office 2007创建2003 Excel工作表
- 5. 以编程方式在Excel 2007中以编程方式添加条件格式
- 6. 编写VBA在Excel 2007在Excel 2003
- 7. 以编程方式将Xml数据注入到Excel 2007工作簿中
- 8. 以编程方式创建Excel 2007表格
- 9. 以编程方式更改Excel文件的工作表名称
- 10. Excel VBA中从Excel工作表
- 11. 如何以编程方式检索Excel工作表中的页数?
- 12. 如何以编程方式在C#中的Excel工作表上创建按钮?
- 13. Excel VBA - 以编程方式更改图表的来源?
- 14. 以编程方式删除excel工作表
- 15. Excel VBA:如何以可编程方式打开对齐网格
- 16. Excel的VBA:工作表
- 17. Excel - 以编程方式削减行
- 18. 以编程方式注释Excel图表
- 19. 以编程方式创建Excel VBA验证列表
- 20. 如何以编程方式忽略密码保护的Excel工作表
- 21. 如何在打开工作表时以编程方式更改Excel 2007功能区上的标签值
- 22. 在执行过程中Excel冻结
- 23. 从Outlook中的VBA中,如何冻结Excel中的窗格?
- 24. 在Excel中以编程方式关闭工作簿
- 25. 以编程方式在Excel中隐藏活动工作簿
- 26. 以编程方式从VSTO Excel工作簿中读取_AssemblyLocation
- 27. Excel冻结太多的行
- 28. VBA Excel 2007宏在Excel 2002中死亡
- 29. TreeView Excel 2007以编程方式选择复选框
- 30. Excel Interop不会以编程方式注册我的工作簿
似乎像ScreenUpdating必须在此工作,但否则很好。谢谢! – 2010-07-12 23:25:20
我不清楚如何通过选择顶行来冻结最上面的一行。要冻结最上一行,选择应该是'行(2)'或'行(“2:2”)'。选择“行”(“1:1”)会导致工作表的四象限分割。 – Jeeped 2015-07-29 15:10:26
@Jeeped m) - 当然!好的发现,谢谢! – Tomalak 2015-07-29 15:12:07