Excel中的动态冻结窗格/冻结行
我需要Excel中的动态冻结标题行,因为我正在处理的工作表有多个表,这些表很大,如果它们位于同一工作表上,则更容易理解 但在无休止地搜索之后,我找不到解决方案,因为没有滚动事件,滚动也不会改变活动单元格Excel中的动态冻结窗格/冻结行,excel,excel-formula,vba,Excel,Excel Formula,Vba,我需要Excel中的动态冻结标题行,因为我正在处理的工作表有多个表,这些表很大,如果它们位于同一工作表上,则更容易理解 但在无休止地搜索之后,我找不到解决方案,因为没有滚动事件,滚动也不会改变活动单元格 谢天谢地,我找到了一个解决办法。在搜索如何识别活动窗口中运行的第一个可见行之后,我找到了一个可接受的解决方案 然后,我能够将代码转换成一个函数,该函数可以与计时器事件结合使用,计时器事件仅在需要冻结行的工作表上激活 工作表代码: Private Sub Worksheet_Activate()
谢天谢地,我找到了一个解决办法。在搜索如何识别活动窗口中运行的第一个可见行之后,我找到了一个可接受的解决方案 然后,我能够将代码转换成一个函数,该函数可以与计时器事件结合使用,计时器事件仅在需要冻结行的工作表上激活 工作表代码:
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
动态冻结窗格模块代码:
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
私人刷新时间
子窗格()
'检查是否激活了正确的工作表
如果ActiveWorkbook.ActiveSheet.Name=“数据”,则
如果IdentificationToVisibleRow<227,则
'检查冻结行是否与要复制的范围相同
如果范围(“A1”)范围(“AN1”),则
'复制冻结行的新标题
范围(“AN1:BU1”)。副本
范围(“A1”)。粘贴特殊XLPaste值
如果结束
否则,如果IdentificationTopVisibleRow>227,则
'检查冻结行是否与要复制的范围相同
如果范围(“A1”)范围(“AN2”),则
'复制冻结行的新标题
范围(“AN2:BU2”)。副本
范围(“A1”)。粘贴特殊XLPaste值
如果结束
如果结束
其他的
停止冷冻Panetimerefresh
如果结束
端接头
子星freezepanetimerefresh()
调用设置冻结窗格
刷新时间=现在+时间值(“00:00:01”)
Application.OnTime刷新时间,“StartFreezePaneTimeRefresh”
端接头
子站点冻结Panetimerefresh()
出错时继续下一步
Application.OnTime RefreshTime,“StartFreezePaneTimeRefresh”,False
端接头
公共函数IdentifyTopVisibleRow()的长度为
'此代码在MSDN上的
'https://social.msdn.microsoft.com/Forums/en-US/a6cff632-e123-4190-8556-d9f48af8fe9a/identify-first-visible-row-of-scrolled-excel-worksheet?forum=isvvba
变暗lngTopRow为长“顶行
将lngNumRows设置为“长”可见行数
Dim lngLeftCol作为最左侧的长列
Dim lngNumCols作为“长”可见列数
使用ActiveWindow.VisibleRange
lngTopRow=.Row
lngNumRows=.Rows.Count
lngLeftCol=.Column
lngNumCols=.Columns.Count
以
IdentificationTopVisibleRow=lngTopRow
端函数
该代码首先检查正确的工作表是否处于活动状态,如果处于活动状态,则每秒检查最上面的一行
如果顶行大于或小于每个表的起始行,它将检查第一个标题是否已设置,以防止其反复更改值
如果没有,它将根据用户在工作簿中的位置更改冻结的行值
注意事项:
更改延迟了1秒,但这对于我这样做是可以接受的
我在上面使用的工作表是“仅视图”,因为如果您知道如何设置第一行的值而不更改选择,这将不断地将焦点转移到第一行,这将非常有效