VBA 在滚动期间冻结 excel 中两个不同行(窗格)的脚本

VBA Script to freeze two diferent rows (panes) in excel during scroll

我有一个电子表格 (Example Spreadsheet ),我想向下滚动并在向下滚动时当电子表格到达那里时冻结两个特定的单独行。我希望它在第 1 行 "scrolled" 向上时冻结第 2-4 行,并继续滚动其余行(在已经冻结的第 2~4 行下方)直到它到达第 62 行,然后它将冻结第 62-64 行(除了已经冻结的第 2-4 行)并继续滚动直到电子表格结束。

例如: 我有一个包含两个 "areas" 的工作表。顶部区域显示月度收入,下方区域显示年度收入。第 1 行没有任何内容,月份 header(12 月 19 日、1 月 20 日等)在第 4 行。在此处的示例电子表格中,我将第 1 行向上滚动 (hidden-scrolled),并冻结第 2-4 行。然后我向下滚动直到我到达第 62 行,我每年的钱 header 开始,然后它将冻结第 62-64 行并继续滚动剩余的行。

是否可以使用某种编码实现这样的事情?

选项 1:妥协

这不是一件容易的事,因此您可能需要考虑简单地将这两个部分分成 2 个不同的 sheet,然后像这样在每个 sheet 中简单地使用冻结窗格方法:

对于第 1 行,如果它让您感到困扰,您可以在应用冻结之前简单地滚动过去。

您甚至可以在页面的 bottom/top 添加一个按钮,让用户在点击时转到另一个 sheet 以获得更好的用户体验。

选项 2:全力以赴

首先,an article on Chip Pearson's blog 显示了如何使用 类 和 Windows API 检测 VBA 滚动.这有点高级,但如果您想达到您想要的结果,这是必不可少的。

其次,您需要使用 ActiveWindow.FreezePanes 属性 来切换窗格的冻结(true 或 false)。这里唯一的问题是,窗格的冻结方式将受到 selected 哪个单元格的影响,因此您的代码必须 select 适当的单元格(最左边的单元格,就在您不要的区域下方' 想像上图中的那样滚动)。而且它还必须确保上面的数据滚动过去。

因此,您可以根据 C.Pearson 方法中提供的左上角单元格行设置条件,如果该行大于某个阈值,则 1) 解冻窗格; 2)滚动到右边的行和列; 3) select 合适的单元格; 4) 像这样重新应用冻结:

ActiveWindow.FreezePanes = False

ActiveWindow.ScrollRow = 62
ActiveWindow.ScrollColumn = 1

ActiveSheet.Range("A65").Select

ActiveWindow.FreezePanes = True

当用户向上滚动时类似。