蒂姆(Tim)有一些工作表,这些工作表有两个单独的部分(我们分别称为上半部分和下半部分),它们的列标题略有不同。他冻结了第一行,以保持向下滚动时上部标题的可见,但是在滚动超过某个点后,Tim最终查看了下部标题顶部仍位于下部的数据。他想知道是否有一种方法可以在向下滚动到仅显示下部数据的点时,切换冻结的标题行以显示下部标题。

是的,有一种方法可以做到这一点,但是它涉及到宏的使用。

在考虑基于宏的解决方案之前,您可能需要考虑重组数据,以便每个部分都在不同的工作表上。 (从设计的角度来看,这将是最简单的解决方案。)如果这不可能,那么您需要查看宏。

一种简单的方法是根据选择的行来简单地更改工作表的第一行(第1行)中存储的内容。例如,下面的宏将根据活动单元格的位置在第一行中进行更改。如果在第40行之前,则将一组标题填充到第一行;如果在第40行之后,则填充另一组标题。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim iBottomData As Integer

iBottomData = 40

If ActiveCell.Row < iBottomData Then         Cells(1, 1).Value = "Last Name"

Cells(1, 2).Value = "First Name"

Cells(1, 3).Value = "Address"

Cells(1, 4).Value = "Balance"

Else         Cells(1, 1).Value = "Account"

Cells(1, 2).Value = "Sales Rep"

Cells(1, 3).Value = "Status"

Cells(1, 4).Value = ""

End If End Sub

要使用该宏,只需确保将其放置在包含两个数据部分的工作表的代码窗口中即可。您还应该更改分配给iBottomData变量的值,以反映底部数据部分开始的行号。

如果您想在向下移动工作表时实际更改冻结的行,则宏需要更强大。实际上,紧随其后的是两个宏(在工作表的代码窗口中都是不变的),当您更改选定的单元格并在工作表上单击鼠标右键时,它们就会生效。

Private Sub Worksheet_BeforeRightClick(ByVal _   Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.EnableEvents = False     Application.Goto Cells(1, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     Application.Goto Cells(Target.Row - 1, _       Target.Column), scroll:=True     Application.EnableEvents = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(-1, 1 - Target.Column).Select     ' so the right click menu doesn't popup     ' only if this is the second header row.

Cancel = True      Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False     If Cells(Target.Row, 1).Value <> "title2" Then Exit Sub     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.Goto Cells(Target.Row, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(1, 1 - Target.Column).Select     Application.EnableEvents = True End Sub

当活动单元格光标碰到该行时,Worksheet_SelectionChange事件处理程序会自动将冻结的拆分移动到标题的第二行下方。在If语句中检测到此行,该语句检查行中的第一个单元格是否包含文本“ title2”。

(显然,应更改此值以反映第一个单元格中的实际情况。)

Worksheet_BeforeRightClick事件处理程序将冻结的拆分移回第一组标题,但是将活动单元格留在第二组标题上方的行。

您应该了解,本技巧文章中介绍的两个宏解决方案都假定您实际上是在工作表中滚动并随即更改所选的单元格。 (换句话说,您按下向下箭头键进行滚动。)如果您只是使用垂直滚动条来更改工作表中显示的内容,则冻结的标题将不会更改,因为您没有更改选定的单元格,事件处理程序将永远不会触发。

创建更广泛的解决方案将超出本技巧的范围,因为它将涉及与实际操作系统的接口。

但是,如果您对这条路线感兴趣,那么可以在Chip Pearson的网站上找到一个很好的起点:

http://www.cpearson.com/excel/DetectScroll.htm

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3446)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: