夜雨聆风学习资料网

ARTICLE · 1246459

Excel VBA编程-一键给表格自动加序号

Excel VBA编程-一键给表格自动加序号

上一讲我们用 VBA「一键给数据排序」,把乱糟糟的表按列排得整整齐齐。但办公里还有个天天出现的小活儿:表格要有一列连续编号(1、2、3…)当序号、当序号标签、或者给每行一个唯一 ID——手动从 1 拖到几百,拖到一半手一抖、中间插了行又得重来,又慢又容易断号。

这一讲我们从网络上整理了一批 Excel VBA「自动加序号」的实用技巧,核心就一句话:用最基础的 For…Next 循环,一行一行往下把连续数字写进指定列。这是国内外公认最稳、最适合零基础的写法,我们把大家公认的要点拆开讲:

  • ExcelMacroClass / ExcelWiz / TpointTech 共同确认:最简单的套路就是 For i = 起点 To 末行 : Cells(i, 列).Value = 序号 : Next i——循环变量当行号、再单独用一个"序号"变量当要填的数字,每填一行序号加 1。它比数组、比 AutoFill 都好懂,零基础一眼能看明白。
  • ExcelWiz 实战经验:数据行数老变?用 Cells(Rows.Count, 列).End(xlUp).Row 找到最后一行的行号,循环就从 2(让开第 1 行标题)一直跑到末行,表多大都不用手改"To 100"。
  • 中文实战站 tsight 提醒:运行前把表点成「当前表」、工作簿存成 .xlsm、第一次先在副本上试,避免误改正式数据。

把这些揉到一起,这篇只讲一个核心套路:找到末行 → 从第 2 行起用 For 循环逐行填连续序号 → 表头不动、同行其他列跟着走。下面用 3 个由浅入深的案例带你走一遍。

(小前提:下面所有代码都假设你当前打开的那张表就是你要处理的表。运行前先把表点成「当前表」。加序号会直接改写指定列,动手前强烈建议先另存一份副本!)


案例一(简单):一键给 A 列填上连续序号 1、2、3…

功能说明 这是最基础的「整列加序号」。你只要把数据摆在当前表(第一行是标题),运行这一段,Excel 就会从 A 列第 2 行开始,依次填上 1、2、3……一直填到数据最后一行,第 1 行标题原封不动。第一次试,强烈建议先备份数据。

代码

Sub 一键给A列加序号()    ' 给当前表的 A 列填连续序号,第1行是标题所以序号从第2行开始    Dim 末行 As Long    Dim i As Long    Dim 序号 As Long    末行 = Cells(Rows.Count, 1).End(xlUp).Row   ' 自动找到 A 列最后一行    序号 = 1                                    ' 序号从 1 开始    For i = 2 To 末行        Cells(i, 1).Value = 序号                ' 第 i 行的 A 列填上当前序号        序号 = 序号 + 1                         ' 填完一行,序号加 1,下一行就是 2、3……    Next i    MsgBox "A 列序号填好啦,共 " & (末行 - 1) & " 个!", vbInformationEnd Sub

操作步骤

  1. 在 Excel 里准备好一张表,第一行是标题(如"姓名、部门、工资"),下面若干行数据,方便看编号效果。
  2. 按 Alt + F11 打开 VBA 编辑器,点菜单「插入」→「模块」,把上面的代码整段粘进去。
  3. 回到 Excel,点一下你的数据表让它成为「当前表」,按 Alt + F 8,选中「一键给A列加序号」,点「运行」。
  4. 程序会从 A 列第 2 行起填 1、2、3……直到最后一行,最后弹窗提示填了多少个。
  5. 想填到别的列?把代码里两处 Cells(i, 1) 的 1 改成 2(填 B 列)、3(填 C 列)即可,再运行。

小提示:Cells(i, 1) 里的 1 是列号(1=A 列、2=B 列、3=C 列)。序号 = 序号 + 1 是"每填一行,序号加 1"的关键;如果把 序号 = 1 改成 序号 = 100,序号就会从 100 开始往下排。循环里 For i = 2 To 末行 的 2 是"从第 2 行开始",专门为让开第 1 行标题。


案例二(中等):运行时自己选【填哪一列】和【从几号开始】

功能说明 案例一列和起始号都写死在代码里。这个案例改成:运行后弹框让你输入「要填序号的列字母(如 A 或 C)」和「起始编号(如 1 或 100)」。程序会自动找到该列的最后一行,把序号从你指定的数一路填下去——不管你表有多少行、填哪一列,都不用手改行号列号。

代码

Sub 一键自选列加序号()    ' 运行时输入列字母和起始编号,自动找末行后给该列填连续序号    Dim 列字母 As String    Dim 起始号 As Long    Dim 末行 As Long    Dim i As Long    Dim 序号 As Long    列字母 = InputBox("请输入要填序号的列字母,例如 A 或 C:", "选择列")    If 列字母 = "" Then Exit Sub               ' 没填就退出,不乱动    起始号 = Val(InputBox("请输入起始编号,例如 1 或 100:", "选择起始号"))    末行 = Cells(Rows.Count, 列字母).End(xlUp).Row   ' 找该列(如 A 列)最后一行    序号 = 起始号    For i = 2 To 末行        Cells(i, 列字母).Value = 序号          ' 第 i 行的指定列填上当前序号        序号 = 序号 + 1    Next i    MsgBox "已给 " & 列字母 & " 列填好序号,从 " & 起始号 & " 开始!", vbInformationEnd Sub

操作步骤

  1. 把代码粘进同一个模块(和案例一放一起也行)。表里准备一张多列数据做测试。
  2. 回到 Excel,点一下数据表让它成为「当前表」,按 Alt + F 8 运行「一键自选列加序号」。
  3. 第一个框输入要填的列字母(如 A 表示填 A 列),第二个框输入起始编号(如 1 或 100),依次点「确定」。
  4. 程序自动找到该列末行,从你指定的号一路填下去,弹窗提示完成。
  5. 列字母留空,程序会提示并自动停下,不会乱改你的数据;起始编号填非数字会当 0 处理,记得填数字。

关键点:用 Cells(Rows.Count, 列字母).End(xlUp).Row 找到指定列最后一个有数据的行号(末行),再用 For i = 2 To 末行 从标题下一行一直跑到末行。列字母 是像 "A" 这样的列字母字符串,直接写进 Cells(i, 列字母) 就能定位到那一行那一列。全程只用已经学过的 Cells、End、InputBox、For…Next,不引入任何没见过的语法。


案例三(实用小案例):只给【有内容】的行编号,空行自动跳过

功能说明 真实表格里经常混着空行、或者不完整的行。如果硬往下填,空行也会占一个号,序号就断了(1、2、4、5…)。这个案例运行后会:只给「B 列(姓名)不为空」的行编序号,空行一律跳过不编号,最后弹窗报告"本次共为 N 行编上连续序号"——保证编号连续、不断号。

代码

Sub 一键智能加序号()    ' 给 A 列加序号,但只给"B 列(姓名)不为空"的行编号,空行自动跳过    ' 适合表里偶尔有空行、不想编出断号的情况    Dim 末行 As Long    Dim i As Long    Dim 序号 As Long    Dim 已编行数 As Long    末行 = Cells(Rows.Count, 1).End(xlUp).Row   ' 自动找到 A 列最后一行    序号 = 1    已编行数 = 0    For i = 2 To 末行        If Cells(i, 2).Value <> "" Then          ' B 列(姓名)不是空,才编号            Cells(i, 1).Value = 序号            序号 = 序号 + 1            已编行数 = 已编行数 + 1        End If    Next i    MsgBox "本次共为 " & 已编行数 & " 行编上连续序号!", vbInformationEnd Sub

操作步骤

  1. 把代码粘进模块(和前两个可以放在同一个模块里)。准备一张含空行、或 B 列偶有空缺的表,方便看"断号变连号"的效果。
  2. 点一下数据表让它成为「当前表」,按 Alt + F 8 运行「一键智能加序号」。
  3. 程序从 A 列第 2 行扫到末行,遇到 B 列有内容的行就编一个连续号、遇到空行直接跳过,弹窗报告编了多少行。
  4. 想换"按哪一列判断是否为空"?把 Cells(i, 2) 的 2 改成你要判断的列号(如 3 看 C 列)即可。

关键经验(来自网络实战总结):

  • 序号是"写进去的数字",不是 Excel 自动行号:它存在单元格里,排序、删除行之后不会自动跟着变,所以每次重排完建议重跑一次,保证序号还是 1、2、3 连续。
  • 空行判断靠 If:用 If Cells(i, 2).Value <> "" 决定这行要不要编号,空行永远不占号,断号问题一次解决。
  • 末行用 End(xlUp) 动态找:表加行、减行都不用改代码,循环自动跟着数据伸缩。
  • 保存工作簿一定要存成 .xlsm 格式,否则宏会丢失。

知识点小结

用 VBA 给表格加序号,本质上就是把「手动从 1 拖到几百、中间还容易断号」这件事,翻译成一段固定动作:找末行 → For 循环从第 2 行跑到末行 → 每行写当前序号、写完加 1 → 弹窗报告填了多少个。三句话记牢就够用:

  1. 循环填号 → For i = 2 To 末行 : Cells(i, 列).Value = 序号 : 序号 = 序号 + 1 : Next i,末行 用 Cells(Rows.Count, 列).End(xlUp).Row 自动找;
  2. 灵活 → 列字母和起始号都能用 InputBox 运行时填,Val 把输入转成数字,列多大都不用手改;
  3. 不断号 → 用 If Cells(i, 判断列).Value <> "" 跳过空行,只给有内容的行编号,序号永远连续。

它和前面学的「排序」「查找替换」「删除重复行」是一套组合拳:替换管"把写错/不统一的词扶正"、去重管"把重复记录并成一条"、排序管"把乱序数据理顺"、加序号管"给每行一个干净的唯一编号"——从收数、清数、改数、排数到编号,全程不用手动点一下。

【SVG 示意图】 


下一篇预告:序号、排序、替换、去重都搞定后,日常还常遇到"要把分散的几列拼成一个完整内容"——比如把"姓"列和"名"列拼成"姓名"列、把"省、市、区"拼成完整地址。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁「一键把多列内容合并成一列」——用 For…Next 逐行读两列、用 & 拼起来写进新列,自动 End(xlUp) 适配行数。


【往期 VBA 精选】

系列已更新 60+ 篇,挑几篇最实用的继续看:

关注公众号「西哥的AI幻觉」,对话框发送「VBA」可获取完整目录与配套源码。

【西哥能帮你做什么】

办公自动化 · AI 视频生产 · AI 编程助手落地 · 工厂数字化

  • 把 Excel / VBA / Python 里那些重复到吐的活,一次性自动化掉
  • 批量产出「古诗每日一诵」式 AI 古诗词视频(配音 + 配图 + 合成一键完成)
  • OpenClaw / WorkBuddy 等 AI 编程助手的企业内训与落地陪跑
  • 从 PLC 到 MES 的工厂务实数字化方案

【找到我】

  • 公众号「西哥的AI幻觉」:点文章右上角「···」设为星标,更新不迷路
  • 加微信:LekonWang(备注「VBA」进学习交流群)

本文由西哥原创,转载请注明出处「西哥的AI幻觉」。

相关学习资料