Bev有一个工作表,其中有两个冻结的标题行和一个冻结的列。然后,她可以每周滚动浏览页面以添加数据。名称和小计固定在左侧,星期几固定在顶部。最重要的是,在冻结的第一行中,Bev有一个漂亮的标题来描述工作簿。她正在寻找一种可以使标题(第一行中的标题)“浮动”的方式,以便在滚动页面时,标题不会消失在可见工作表的边缘。

最简单的方法是确保标题位于单元格A1中。

由于冻结了一列和两行,因此当您滚动到包含标题的右单元格A1时,将始终在屏幕上可见。 (仅当整个标题都适合单元格A1,而不会“溢出”到单元格B1或以后时,这才可以令人满意地工作。)

如果您希望标题看起来更有趣,那么您需要对文本框和宏进行一些工作。如果将标题放置在第一行的文本框中,则可以使用一些宏来确保文本框始终在该行的屏幕上居中。

对于本示例,我们假设包含标题的文本框称为“ TitleTextBox”。在工作表中左右滚动时,宏可以自动检查以确保文本框的左边缘始终等于可见屏幕区域的左边缘。需要将以下代码添加到包含文本框的工作表的工作表代码中:

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Me.Shapes("TitleTextBox").Left = ActiveWindow.VisibleRange.Left End Sub

由于此宏是工作表代码的一部分,因此每次在工作表中更改选择时都会运行该宏。因此,当您使用箭头键向左或向右移动,使用Tab键或使用鼠标选择一个单元格时,宏将运行并确保文本框的左边缘和可见区域始终匹配。

当您不使用该宏时,就是使用屏幕底部的水平滚动条左右滚动。使用滚动条时没有自动触发的“滚动事件”。除非在新的可见范围内的某个位置进行选择,从而触发SelectionChange事件,否则文本框位置将不会移动。

解决此限制的唯一方法是使用Visual Basic的计时器功能定期更新文本框。以下代码每秒执行一次,但是您可以根据需要调整它的运行频率,以减少运行频率。

此代码被添加到常规VBA模块中:

Sub UpdateTB()

If ActiveSheet.Name = "Sheet1" Then         ActiveSheet.Shapes("TitleTextBox").Left = _           ActiveWindow.VisibleRange.Left     End If     Application.OnTime Now + TimeSerial(0, 0, 1), "UpdateTB"

End Sub

并在首次打开工作簿时将其添加到工作簿对象以启动计时器:

Private Sub Workbook_Open()

UpdateTB End Sub

如果使用基于计时器的方法来定位文本框,则不需要使用与SelectionChange事件相关联的方法。计时器版本仅在每个间隔后调整标题。

这两种基于宏的技术都有一个额外的“缺点”,除了运行代码所带来的缓慢之外:每次运行代码时,它都会清除“撤消堆栈”。这意味着,如果需要,您将无法“撤消”对工作簿所做的更改。

注意:

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

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

本技巧(10260)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处找到适用于Excel的较旧菜单界面的本技巧的版本: