夜雨聆风学习资料网

ARTICLE · 1316174

Excel VBA编程-一键批量冻结所有工作表的首行(整本工作簿表头都固定)

Excel VBA编程-一键批量冻结所有工作表的首行(整本工作簿表头都固定)

上一讲我们学会了用 VBA 把“当前这张表”的首行冻结住,表头就能一直钉在屏幕上。但很多同学手上的活儿,是一个工作簿里塞了十几张、甚至几十张表:一月一张、一个门店一张、一个客户一张……每张表第一行都是表头。

Excel 自带的“冻结窗格”按钮,一次只能冻住你现在正在看的那一张表。要一张一张手动点,点到天黑都点不完。好在 VBA 有个“循环”的本领,能让电脑自动把每一张表都跑一遍、分别冻上。今天这一讲,就教你一键把整本工作簿的表头全部固定。

(本讲用到的循环写法、激活工作表的写法,都是前面基础课里讲过的老朋友,不会引入新难点。)

知识点:批量冻结的核心套路

昨天我们讲清了一个规律:冻结的是“当前选中单元格的上边和左边”,所以是“先取消旧冻结 → 选中目标右下一格 → 再冻结”这三步。

今天只是给这三步套了一个“外套”——一个循环:

  1. 用 For Each 工作表 In ActiveWorkbook.Worksheets 把工作簿里的每一张表都轮一遍。
  2. 每轮先用 工作表.Activate 把这张表“切换成当前正在看的表”。因为只有当前活动表的窗口才能被 ActiveWindow.FreezePanes 控制。
  3. 在每张表上重复昨天的三步(取消冻结 → 选中 A2 → 冻结),循环转完一圈,所有表的表头就都钉住了。

记住一句话:单张表会冻了,套上循环就会批量冻了。 网络上(比如微软官方社区、Contextures 教程站)给出的“一次性冻结所有表”代码,用的也都是这个 For Each 遍历 + Activate + FreezePanes 的组合。

【SVG 示意图】

案例一(简单):一键冻结所有工作表的首行

功能说明:把当前工作簿里每一张表的第一行(表头)都钉在顶部。最适合“一本工作簿、多张同结构表格”的场景,比如月度报表、分店台账。运行一次,翻到哪张表表头都看得见。

操作步骤:

  1. 按 Alt + F11 打开 VBA 编辑器,插入一个“模块”。
  2. 把下面代码整段粘贴进去。
  3. 回到 Excel,确认目标工作簿是打开的那个。
  4. 按 Alt + F8,选中“批量冻结所有表的首行”,点“运行”。
  5. 弹窗提示后,随便翻几张表往下滚,表头都钉在顶上了。
Sub 批量冻结所有表的首行()    Dim 工作表 As Worksheet    For Each 工作表 In ActiveWorkbook.Worksheets        工作表.Activate        ActiveWindow.FreezePanes = False        Range("A2").Select        ActiveWindow.FreezePanes = True    Next 工作表    MsgBox "已经把所有工作表的首行都冻结了。", vbInformationEnd Sub

小提示:For Each 工作表 In ActiveWorkbook.Worksheets 就是“把每张表轮流处理一次”。循环里前三句和昨天单张冻结完全一样,只是多了一句 工作表.Activate 让电脑先“切到这张表”再冻。运行完后,活动表会停在最后一张表,这是正常的。

案例二(中等):一键检查并统一解冻所有工作表

功能说明:和案例一反着来——把整本工作簿里所有被冻结的表统一解冻,恢复成可以随意滚动的状态。它先检查每张表“现在到底冻没冻”,只有已经冻住的才去取消,没冻的就不碰,干净利落。

操作步骤:

  1. 在模块里再粘贴下面代码。
  2. 回到 Excel,按 Alt + F8,选中“统一解冻所有表”,点“运行”。
  3. 弹窗提示后,所有表的冻结都已经取消。
Sub 统一解冻所有表()    Dim 工作表 As Worksheet    For Each 工作表 In ActiveWorkbook.Worksheets        工作表.Activate        If ActiveWindow.FreezePanes = True Then            ActiveWindow.FreezePanes = False        End If    Next 工作表    MsgBox "所有工作表的冻结都已经取消了。", vbInformationEnd Sub

小提示:关键的 If ActiveWindow.FreezePanes = True Then 就是“先检查是否已冻”。这样即使某些表本来就没冻,也不会报错。这个“先判断再动手”的习惯,在 VBA 里非常常用,能避免很多奇怪的出错弹窗。

案例三(实用):按自己需要,批量冻结每张表的前 N 行、前 M 列

功能说明:弹窗让你分别填“要冻结前几行、前几列”,然后给所有表同时冻上这个区域。比如你每张表都有两行表头、左边两列是编号,就填行数 2、列数 2,一次全部设好,不用逐张表去点。

操作步骤:

  1. 在模块里粘贴下面代码。
  2. 回到 Excel,按 Alt + F8,选中“批量冻结指定行列”,点“运行”。
  3. 第一个弹窗填“要冻结前几行”(如填 1,就是表头那一行),第二个弹窗填“要冻结前几列”(如填 1,就是最左那一列)。
  4. 程序自动轮遍每张表,分别选中第(行数加1)行第(列数加1)列的位置并冻结,最后弹窗告诉你冻结了什么。
Sub 批量冻结指定行列()    Dim 工作表 As Worksheet    Dim 行数 As Long, 列数 As Long    行数 = Val(InputBox("要冻结前几行?例如填 1(表头那一行)。", "冻结行数"))    列数 = Val(InputBox("要冻结前几列?例如填 1(最左那一列)。", "冻结列数"))    If 行数 <= 0 And 列数 <= 0 Then        MsgBox "请至少填写大于 0 的数字,否则没有可冻结的内容。", vbExclamation        Exit Sub    End If    For Each 工作表 In ActiveWorkbook.Worksheets        工作表.Activate        ActiveWindow.FreezePanes = False        Cells(行数 + 1, 列数 + 1).Select        ActiveWindow.FreezePanes = True    Next 工作表    MsgBox "已批量冻结所有工作表的前 " & 行数 & " 行、前 " & 列数 & " 列。", vbInformationEnd Sub

小提示:原理和昨天案例三一样——“选中第(行数加1)行、第(列数加1)列的那个单元格,再冻结”。区别只是外面多套了一层 For Each 工作表 循环,让每张表都执行一遍。比如填行数 2、列数 1,就每张表都去选中 C3,于是上方 2 行、左边 1 列都被钉住。

知识点小结

  • 批量冻结 = 单张冻结的三步(取消旧冻结 → 选中目标右下一格 → 冻结),外面套一个 For Each 工作表 In ActiveWorkbook.Worksheets 循环。
  • 循环里必须先 工作表.Activate,把那张表切到“当前活动表”,ActiveWindow.FreezePanes 才会作用到它身上。
  • 冻结首行选 A2,冻结首列选 B1,同时冻首行首列选 B2;灵活指定就用 Cells(行数加1, 列数加1).Select 配合 InputBox。
  • “先判断再动手”是好习愦:If ActiveWindow.FreezePanes = True Then 能避免对没冻的表重复操作而报错。
  • 冻结只改“看表的窗口”,不碰数据;想全部取消,就跑一遍“统一解冻所有表”。

往期精选(同系列教程)

  • Excel VBA编程-一键冻结首行
  • Excel VBA编程-一键删除表格里的空行和空列
  • Excel VBA编程-一键批量删除文本里的换行符和特殊符号
  • Excel VBA编程-一键清理文本
  • Excel VBA编程-一键从文本里提取指定内容

其他信息

  • 作者:西哥的AI幻觉
  • 本文代码均已测试,可直接复制到 Excel VBA 编辑器运行。
  • 文件请保存为 .xlsm 格式(启用宏的工作簿),否则代码无法保存。
  • 运行前请确认目标工作簿是打开的那个;若某张工作表处于“保护”状态,需先取消保护才能冻结,否则会报错。
  • 若工作簿被拆成多个窗口(多个 Excel 窗口各看一部分),ActiveWindow 只控制当前这个窗口,这种情况建议先关掉多余窗口再运行。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料