从Outlook中的VBA,如何在Excel中冻结窗格?

时间:2016-11-16 01:53:43

标签: excel vba outlook-vba

我正在Outlook中编写一个引用Excel工作簿并对该工作簿进行更改的VBA宏。我想在第1行下方冻结窗格(而不是#34; Split")。

这是我尝试过的代码:

With Excel.ActiveWindow
    .SplitColumn = 0
    .SplitRow = 3
    .FreezePanes = True
End With

...和...

Dim excApp As Object
Set excApp = CreateObject("Excel.Application")

With excApp.ActiveWindow
    .SplitColumn = 0
    .SplitRow = 3
    .FreezePanes = True
End With

两者都在行.SplitColumn = 0处投掷了运行时错误91。

我感谢任何帮助或指示。谢谢!

2 个答案:

答案 0 :(得分:4)

使用冻结窗格时,它实际上与光标位置有关,因此这是实际需要.Select的少数几个地方之一。

此代码应该按照您的要求执行:

Dim excApp As Excel.Application
Set excApp = GetObject(, "Excel.Application")

excApp.ActiveWorkbook.ActiveSheet.Range("2:2").Select
excApp.ActiveWindow.FreezePanes = True

预先假定Excel已经开放。

- 编辑 -

根据@ChrisB,有一种方法可以做到这一点,没有可怕的.Select

With excApp.ActiveWindow
    .SplitRow = 3
    .FreezePanes = True
End With

答案 1 :(得分:0)

这里是另一个。它是一种功能,您也可以从Excel外部使用,例如通过Access或Outlook:

Public Sub FreezeHeader(Sheet As Excel.Worksheet, _
                        Optional Rows As Long = 1, _
                        Optional Columns As Long = 0)
    If Sheet Is Nothing Then Exit Sub

    Sheet.Activate      ' must be the active sheet!
    With Sheet.Parent.Windows(1)
        If .FreezePanes Then .FreezePanes = False ' always delete the old freeze

        .SplitColumn = Columns
        .SplitRow = Rows

        If Rows > 0 Or Columns > 0 Then .FreezePanes = True
    End With
End Sub

现在像这样使用它:

Dim EXL As Excel.Application
Dim Book As Excel.Workbook
Dim Sheet As Excel.Worksheet

Set EXL = New Excel.Application
Set Book = EXL.Workbooks.Open("YourFilename.xlsx")
Set Sheet = Book.Sheets(1)

FreezeHeader Sheet       ' Freezes first row (the usual case)
FreezeHeader Sheet, 2    ' Freezes first two rows
FreezeHeader Sheet, 0, 1 ' Freezes first column
FreezeHeader Sheet, 0    ' Unfreezes all