夜雨聆风学习资料网

ARTICLE · 1323456

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

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

很多从系统导出、或者自己攒的大表格,动辄几百上千行。往下一拉,表头(第一行那排标题)就滚没影了,你根本分不清哪一列是“姓名”、哪一列是“金额”,对数据对得头昏眼花。

其实 Excel 自带一个“冻结窗格”的功能,能把表头钉在屏幕上,怎么滚都不动。今天就来学怎么用 VBA 一键搞定它。

知识点:冻结窗格的本质

一句话:冻结窗格冻结的是“当前选中单元格的上边、左边”。 选中第 2 行,第 1 行就被钉住;选中 B 列,A 列就被钉住。这个规律记住了,后面三个案例就全通了。

所以代码只有三步套路:

  1. 先把旧的冻结取消(ActiveWindow.FreezePanes = False),否则已经冻结过时再冻会出错。
  2. 用 Range("A2").Select 之类,把活动单元格放到“要冻结区域的右下方一格”。
  3. 再 ActiveWindow.FreezePanes = True,搞定。

注意:冻结只改变“你看表格的窗口”,不动任何数据、不改单元格,随时可以再取消。

【SVG 示意图】

案例一(简单):一键冻结当前表的首行(表头)

功能说明:把当前正在看的工作表的第一行(表头)钉在顶部,往下翻多少行都看得见标题。最适合那种“几百行数据 + 一行表头”的常规表格。

操作步骤:

  1. 按 Alt + F11 打开 VBA 编辑器,插入一个“模块”。
  2. 把下面代码整段粘贴进去。
  3. 回到 Excel,确认要冻结的那张表是当前活动表。
  4. 按 Alt + F8,选中“一键冻结首行”,点“运行”。
  5. 弹窗提示后,往下滚动,表头就一直钉在顶上了。
Sub 一键冻结首行()    ActiveWindow.FreezePanes = False    Range("A2").Select    ActiveWindow.FreezePanes = True    MsgBox "首行已冻结,表头会一直显示在顶部。", vbInformationEnd Sub

小提示:关键是 Range("A2").Select——冻结的是“选中格上边和左边”,所以选中第 2 行,第 1 行就被钉住。如果想冻结前两行,把 A2 改成 A3 即可。

案例二(中等):一键冻结首列(最左列始终可见)

功能说明:当表格列很多、需要横向滚动时,把最左边一列(比如“姓名”或“编号”列)钉在左侧,向右翻也认得清每一行是谁。

操作步骤:

  1. 在模块里再粘贴下面代码。
  2. 确认目标表是当前活动表。
  3. 运行“一键冻结首列”。
  4. 向右滚动,最左列就一直留在左边。
Sub 一键冻结首列()    ActiveWindow.FreezePanes = False    Range("B1").Select    ActiveWindow.FreezePanes = True    MsgBox "首列已冻结,最左列会一直显示在左侧。", vbInformationEnd Sub

小提示:这里选中的是 B1,冻结“选中格左边”,所以 A 列被钉住。想同时冻结首行加首列(选中 B2),可以直接看案例三。

案例三(实用):按自己需要冻结前 N 行、前 M 列

功能说明:弹窗让你分别填“要冻结前几行、前几列”,灵活冻结任意区域,比如同时冻住表头两行和左边两列。适合宽表、大表一次设好,不用反复手动点。

操作步骤:

  1. 在模块里粘贴下面代码。
  2. 运行“一键冻结指定行列”。
  3. 第一个弹窗填“要冻结前几行”(如填 1,就是表头那一行),第二个弹窗填“要冻结前几列”(如填 1,就是最左那一列)。
  4. 程序自动选中第(行数加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 格式(启用宏的工作簿),否则代码无法保存。
  • 冻结前请确认目标工作表是当前活动表,且工作表未被保护(已保护的工作表需先取消保护)。

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

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

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

相关学习资料