Excel中的dynamic冻结窗格/冻结行

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

但经过无休止的search,我无法find解决scheme,因为没有滚动事件,滚动不会更改活动单元格。

谢天谢地,我find了一个解决办法。

在search如何识别活动窗口中的第一个可见行之后,我能够为我的困境提出可接受的解决scheme

MSDN:确定活动窗口的第一个可见行

然后,我可以把这段代码转换成一个函数,这个函数可以和定时器事件结合使用,这个事件只在需要冻结的工作表上激活。

表单代码:

Private Sub Worksheet_Activate() StartFreezePaneTimeRefresh End Sub Private Sub Worksheet_Deactivate() StopFreezePaneTimeRefresh End Sub 

dynamic冻结窗格模块代码:

 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秒,但是对于我正在做的这个是可以接受的。

我正在使用这个工作表是只有视图,因为如果你有一个想法如何设置第一行值而不改变select,这将使这个工作很好,这将不断转移焦点到第一行。