excel vba冻结窗格没有选择

Chr*_*isB 14 excel vba excel-vba

我在Excel中有一个VBA脚本冻结了Excel工作表的窗格,但我很想知道如果没有先选择一个范围,这是否可行.现在通过代码冻结第1行到第7行:

ActiveSheet.Range("A8").Select
ActiveWindow.FreezePanes = True
Run Code Online (Sandbox Code Playgroud)

有什么建议?

小智 39

使用视图►冻结窗格►冻结顶行命令记录自己,这就是.FreezePanes的功能.

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

因此,无论ActiveCell属性是什么,修改.SplitColumn和/或.SplitRow属性都应该为您完成.

  • 如果您通过Application.Windows("[window name]")访问Window对象,则可以避免使用ActiveWindow,其中[window name]是Workbook.Name (6认同)
  • 做得很好!对于其他所有人,请注意,SplitColumn / SplitRow值表示拆分上方/左侧的最后一个单元格。因此,要冻结第1至第7行并将其与第8行分开,代码如下所示:`With ActiveWindow .SplitColumn = 0 .SplitRow = 7 End With ActiveWindow.FreezePanes = True` (2认同)
  • 当您尝试冻结并且激活的单元格远离您打算冻结的位置时,代码会导致错误。我打算冻结第一列和许多行,并且行被正确冻结,但对于列,第一个可见列被冻结,这是任意的。如果我随后手动解冻,它仍保持分屏状态。我尝试在代码之前添加 activate ,但这没有任何效果(可能是因为我关闭了 Screenupdate 以加速宏)...然后我尝试了 z32a7ul 发布的解决方案并且有效。我想造成差异的是添加了滚动。 (2认同)

z32*_*7ul 5

冻结窗格有很多错误。我添加了我自己的答案,所以我会在这里找到它,下次不必重新发明它。

Public Sub FreezePanesAt(rngDataTopLeft As Range)
    Dim wndCurrent As Window: For Each wndCurrent In rngDataTopLeft.Worksheet.Parent.Windows
        With wndCurrent
            .FreezePanes = False
            If Not ((rngDataTopLeft.Row = 1) And (rngDataTopLeft.Column = 1)) Then
                .ScrollRow = 1
                .ScrollColumn = 1
                .SplitRow = rngDataTopLeft.Row - 1
                .SplitColumn = rngDataTopLeft.Column - 1
                .FreezePanes = True
            End If
        End With
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

用法示例:

FreezePanesAt ThisWorkbook.Worksheets("Sheet1").Range("B3")
FreezePanesAt ThisWorkbook.Names("Header").RefersToRange
Run Code Online (Sandbox Code Playgroud)
  • 输入参数是右下窗格的左上角单元格;我认为这是最常见的用例:您知道要拆分的范围并且不关心它在哪个工作簿/工作表/窗口中
  • 如果输入参数在第一行/第一个单元格但不在 A1 中,则只有两个窗格;A1 是一种特殊情况,但是,Excel 会在当前视图的中心拆分窗口,我阻止了这种情况,因为我想不出任何情况
  • 它遍历附加到工作簿/工作表的所有 Windows;置入到Application.WindowsWindows(Thisworkbook.Name)如果你有多个窗口为同一工作簿(名称将是“MyWorkbook:1”))将不会导致错误或Excel企图(这通常失败)崩溃后修复工作簿(国名是“MyWorkbook [已修复]”)
  • 它考虑到窗格可能已经被冻结并且用户/另一个宏可能已经滚动到工作簿中的某个位置,并且窗口中的左上角单元格不是 A1