ARTICLE · 1323456
Excel VBA编程-一键冻结首行(让表头始终可见)

很多从系统导出、或者自己攒的大表格,动辄几百上千行。往下一拉,表头(第一行那排标题)就滚没影了,你根本分不清哪一列是“姓名”、哪一列是“金额”,对数据对得头昏眼花。
其实 Excel 自带一个“冻结窗格”的功能,能把表头钉在屏幕上,怎么滚都不动。今天就来学怎么用 VBA 一键搞定它。
知识点:冻结窗格的本质
一句话:冻结窗格冻结的是“当前选中单元格的上边、左边”。 选中第 2 行,第 1 行就被钉住;选中 B 列,A 列就被钉住。这个规律记住了,后面三个案例就全通了。
所以代码只有三步套路:
先把旧的冻结取消( ActiveWindow.FreezePanes = False),否则已经冻结过时再冻会出错。用 Range("A2").Select之类,把活动单元格放到“要冻结区域的右下方一格”。再 ActiveWindow.FreezePanes = True,搞定。
注意:冻结只改变“你看表格的窗口”,不动任何数据、不改单元格,随时可以再取消。
【SVG 示意图】
案例一(简单):一键冻结当前表的首行(表头)
功能说明:把当前正在看的工作表的第一行(表头)钉在顶部,往下翻多少行都看得见标题。最适合那种“几百行数据 + 一行表头”的常规表格。
操作步骤:
按 Alt + F11打开 VBA 编辑器,插入一个“模块”。把下面代码整段粘贴进去。 回到 Excel,确认要冻结的那张表是当前活动表。 按 Alt + F8,选中“一键冻结首行”,点“运行”。弹窗提示后,往下滚动,表头就一直钉在顶上了。
Sub 一键冻结首行() ActiveWindow.FreezePanes = False Range("A2").Select ActiveWindow.FreezePanes = True MsgBox "首行已冻结,表头会一直显示在顶部。", vbInformationEnd Sub小提示:关键是
Range("A2").Select——冻结的是“选中格上边和左边”,所以选中第 2 行,第 1 行就被钉住。如果想冻结前两行,把 A2 改成 A3 即可。
案例二(中等):一键冻结首列(最左列始终可见)
功能说明:当表格列很多、需要横向滚动时,把最左边一列(比如“姓名”或“编号”列)钉在左侧,向右翻也认得清每一行是谁。
操作步骤:
在模块里再粘贴下面代码。 确认目标表是当前活动表。 运行“一键冻结首列”。 向右滚动,最左列就一直留在左边。
Sub 一键冻结首列() ActiveWindow.FreezePanes = False Range("B1").Select ActiveWindow.FreezePanes = True MsgBox "首列已冻结,最左列会一直显示在左侧。", vbInformationEnd Sub小提示:这里选中的是
B1,冻结“选中格左边”,所以 A 列被钉住。想同时冻结首行加首列(选中 B2),可以直接看案例三。
案例三(实用):按自己需要冻结前 N 行、前 M 列
功能说明:弹窗让你分别填“要冻结前几行、前几列”,灵活冻结任意区域,比如同时冻住表头两行和左边两列。适合宽表、大表一次设好,不用反复手动点。
操作步骤:
在模块里粘贴下面代码。 运行“一键冻结指定行列”。 第一个弹窗填“要冻结前几行”(如填 1,就是表头那一行),第二个弹窗填“要冻结前几列”(如填 1,就是最左那一列)。 程序自动选中第(行数加1)行、第(列数加1)列的位置并冻结,弹窗告诉你冻结了什么。
Sub 一键冻结指定行列() Dim 行数 As Long, 列数 As Long 行数 = Val(InputBox("要冻结前几行?例如填 1(表头那一行)。", "冻结行数")) 列数 = Val(InputBox("要冻结前几列?例如填 1(最左那一列)。", "冻结列数")) If 行数 <= 0 And 列数 <= 0 Then MsgBox "请至少填写大于 0 的数字,否则没有可冻结的内容。", vbExclamation Exit Sub End If ActiveWindow.FreezePanes = False Cells(行数 + 1, 列数 + 1).Select ActiveWindow.FreezePanes = True MsgBox "已冻结前 " & 行数 & " 行、前 " & 列数 & " 列。", vbInformationEnd Sub小提示:原理就是“选中第(N加1)行第(M加1)列的那个单元格,再冻结”。比如填行数 2、列数 1,就选中 C3,于是上方 2 行、左边 1 列都被钉住。要取消冻结,把
ActiveWindow.FreezePanes设成False再运行一次就行。
知识点小结
冻结窗格冻结的是“当前选中单元格的上边和左边”,而不是直接指定“第几行”。 标准三步:先 FreezePanes = False取消旧冻结,再选中目标区域的右下一格,最后FreezePanes = True。冻结首行选 A2,冻结首列选 B1,同时冻首行首列选 B2。 想灵活指定行列,就用 Cells(行数加1, 列数加1).Select配合 InputBox 让使用者自己填。冻结只改“看表的窗口”,不碰数据;随时 FreezePanes = False可取消。
往期精选(同系列教程)
Excel VBA编程-一键删除表格里的空行和空列 Excel VBA编程-一键批量删除文本里的换行符和特殊符号 Excel VBA编程-一键清理文本 Excel VBA编程-一键从文本里提取指定内容 Excel VBA编程-一键把一列按分隔符拆分成多列
其他信息
作者:西哥的AI幻觉 本文代码均已测试,可直接复制到 Excel VBA 编辑器运行。 文件请保存为 .xlsm格式(启用宏的工作簿),否则代码无法保存。冻结前请确认目标工作表是当前活动表,且工作表未被保护(已保护的工作表需先取消保护)。















































































