Excel中的动态冻结窗格/冻结行

时间:2017-10-23 05:11:03

标签: excel excel-vba excel-formula vba

我在Excel中需要一个动态冻结标题行,因为我正在使用的工作表有几个很大的表,如果它们位于同一个工作表上则更容易理解。

但是在无休止地搜索之后我无法找到解决方案,因为没有滚动事件和滚动不会改变活动单元格。

谢天谢地,我想出了一个解决方法。

1 个答案:

答案 0 :(得分:0)

在搜索了如何识别活动窗口中第一个可见行(

)之后,我能够找到一个可接受的解决方案来解决我的困境

MSDN: Identify First Visible Row of Active Window

然后我能够获取该代码并将其转换为可以与Timer事件结合使用的函数,该事件仅在我需要冻结行的工作表上激活。

工作表代码:

Private Sub Worksheet_Activate()
    StartFreezePaneTimeRefresh
End Sub

Private Sub Worksheet_Deactivate()
    StopFreezePaneTimeRefresh
End Sub

动态冻结窗格模块代码:

Private RefreshTime

Sub SetFreezePane()
    'Check if correct worksheet is active
    If ActiveWorkbook.ActiveSheet.Name = "Data" Then
        If IdentifyTopVisibleRow < 227 Then
            'Check if Frozen Row is the same as the Range to be Copied
            If Range("A1") <> Range("AN1") Then
                'Copy New Headers for Frozen Row
                Range("AN1:BU1").Copy
                Range("A1").PasteSpecial xlPasteValues
            End If
        ElseIf IdentifyTopVisibleRow > 227 Then
            'Check if Frozen Row is the same as the Range to be Copied
            If Range("A1") <> Range("AN2") Then
                'Copy New Headers for Frozen Row
                Range("AN2:BU2").Copy
                Range("A1").PasteSpecial xlPasteValues
            End If
        End If
    Else
        StopFreezePaneTimeRefresh
    End If
End Sub

Sub StartFreezePaneTimeRefresh()
    Call SetFreezePane
    RefreshTime = Now + TimeValue("00:00:01")
    Application.OnTime RefreshTime, "StartFreezePaneTimeRefresh"
End Sub

Sub StopFreezePaneTimeRefresh()
    On Error Resume Next
    Application.OnTime RefreshTime, "StartFreezePaneTimeRefresh", , False
End Sub

Public Function IdentifyTopVisibleRow() As Long
    'This code was found on MSDN at
    'https://social.msdn.microsoft.com/Forums/en-US/a6cff632-e123-4190-8556-d9f48af8fe9a/identify-first-visible-row-of-scrolled-excel-worksheet?forum=isvvba
    Dim lngTopRow As Long ' top row
    Dim lngNumRows As Long ' number of visible rows
    Dim lngLeftCol As Long ' leftmost column
    Dim lngNumCols As Long ' number of visible columns
    With ActiveWindow.VisibleRange
        lngTopRow = .Row
        lngNumRows = .Rows.Count
        lngLeftCol = .Column
        lngNumCols = .Columns.Count
    End With
    IdentifyTopVisibleRow = lngTopRow
End Function

代码的工作原理是首先检查正确的工作表是否处于活动状态,如果是,则它每秒检查最可见的行。

如果顶行大于或小于每个表的起始行,则它将检查是否已设置第一个标头以防止它反复更改值。

如果不是,则根据工作簿中的用户位置更改“冻结行”值。

注意:

此更改延迟了1秒,但这对我正在做的事情是可以接受的。

我正在使用它的工作表只是视图,因为如果你知道如何设置第一行值而不改变选择会使这项工作变得很好,这会不断地将焦点转移到第一行。