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

上一讲我们学会了用 VBA 把“当前这张表”的首行冻结住,表头就能一直钉在屏幕上。但很多同学手上的活儿,是一个工作簿里塞了十几张、甚至几十张表:一月一张、一个门店一张、一个客户一张……每张表第一行都是表头。
Excel 自带的“冻结窗格”按钮,一次只能冻住你现在正在看的那一张表。要一张一张手动点,点到天黑都点不完。好在 VBA 有个“循环”的本领,能让电脑自动把每一张表都跑一遍、分别冻上。今天这一讲,就教你一键把整本工作簿的表头全部固定。
(本讲用到的循环写法、激活工作表的写法,都是前面基础课里讲过的老朋友,不会引入新难点。)
知识点:批量冻结的核心套路
昨天我们讲清了一个规律:冻结的是“当前选中单元格的上边和左边”,所以是“先取消旧冻结 → 选中目标右下一格 → 再冻结”这三步。
今天只是给这三步套了一个“外套”——一个循环:
用 For Each 工作表 In ActiveWorkbook.Worksheets把工作簿里的每一张表都轮一遍。每轮先用 工作表.Activate把这张表“切换成当前正在看的表”。因为只有当前活动表的窗口才能被ActiveWindow.FreezePanes控制。在每张表上重复昨天的三步(取消冻结 → 选中 A2 → 冻结),循环转完一圈,所有表的表头就都钉住了。
记住一句话:单张表会冻了,套上循环就会批量冻了。 网络上(比如微软官方社区、Contextures 教程站)给出的“一次性冻结所有表”代码,用的也都是这个 For Each 遍历 + Activate + FreezePanes 的组合。
【SVG 示意图】
案例一(简单):一键冻结所有工作表的首行
功能说明:把当前工作簿里每一张表的第一行(表头)都钉在顶部。最适合“一本工作簿、多张同结构表格”的场景,比如月度报表、分店台账。运行一次,翻到哪张表表头都看得见。
操作步骤:
按 Alt + F11打开 VBA 编辑器,插入一个“模块”。把下面代码整段粘贴进去。 回到 Excel,确认目标工作簿是打开的那个。 按 Alt + F8,选中“批量冻结所有表的首行”,点“运行”。弹窗提示后,随便翻几张表往下滚,表头都钉在顶上了。
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让电脑先“切到这张表”再冻。运行完后,活动表会停在最后一张表,这是正常的。
案例二(中等):一键检查并统一解冻所有工作表
功能说明:和案例一反着来——把整本工作簿里所有被冻结的表统一解冻,恢复成可以随意滚动的状态。它先检查每张表“现在到底冻没冻”,只有已经冻住的才去取消,没冻的就不碰,干净利落。
操作步骤:
在模块里再粘贴下面代码。 回到 Excel,按 Alt + F8,选中“统一解冻所有表”,点“运行”。弹窗提示后,所有表的冻结都已经取消。
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,一次全部设好,不用逐张表去点。
操作步骤:
在模块里粘贴下面代码。 回到 Excel,按 Alt + F8,选中“批量冻结指定行列”,点“运行”。第一个弹窗填“要冻结前几行”(如填 1,就是表头那一行),第二个弹窗填“要冻结前几列”(如填 1,就是最左那一列)。 程序自动轮遍每张表,分别选中第(行数加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只控制当前这个窗口,这种情况建议先关掉多余窗口再运行。















































































