我在Excel中需要一个动态冻结标题行,因为我正在使用的工作表有几个很大的表,如果它们位于同一个工作表上则更容易理解。
但是在无休止地搜索之后我无法找到解决方案,因为没有滚动事件和滚动不会改变活动单元格。
谢天谢地,我想出了一个解决方法。
答案 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秒,但这对我正在做的事情是可以接受的。
我正在使用它的工作表只是视图,因为如果你知道如何设置第一行值而不改变选择会使这项工作变得很好,这会不断地将焦点转移到第一行。