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操作步骤
在 Excel 里准备好一张表,第一行是标题(如"姓名、部门、工资"),下面若干行数据,方便看编号效果。 按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」,把上面的代码整段粘进去。回到 Excel,点一下你的数据表让它成为「当前表」,按 Alt + F 8,选中「一键给A列加序号」,点「运行」。程序会从 A 列第 2 行起填 1、2、3……直到最后一行,最后弹窗提示填了多少个。 想填到别的列?把代码里两处 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操作步骤
把代码粘进同一个模块(和案例一放一起也行)。表里准备一张多列数据做测试。 回到 Excel,点一下数据表让它成为「当前表」,按 Alt + F 8运行「一键自选列加序号」。第一个框输入要填的列字母(如 A表示填 A 列),第二个框输入起始编号(如1或100),依次点「确定」。程序自动找到该列末行,从你指定的号一路填下去,弹窗提示完成。 列字母留空,程序会提示并自动停下,不会乱改你的数据;起始编号填非数字会当 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操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。准备一张含空行、或 B 列偶有空缺的表,方便看"断号变连号"的效果。 点一下数据表让它成为「当前表」,按 Alt + F 8运行「一键智能加序号」。程序从 A 列第 2 行扫到末行,遇到 B 列有内容的行就编一个连续号、遇到空行直接跳过,弹窗报告编了多少行。 想换"按哪一列判断是否为空"?把 Cells(i, 2)的2改成你要判断的列号(如3看 C 列)即可。
关键经验(来自网络实战总结):
序号是"写进去的数字",不是 Excel 自动行号:它存在单元格里,排序、删除行之后不会自动跟着变,所以每次重排完建议重跑一次,保证序号还是 1、2、3 连续。 空行判断靠 If:用 If Cells(i, 2).Value <> ""决定这行要不要编号,空行永远不占号,断号问题一次解决。末行用 End(xlUp) 动态找:表加行、减行都不用改代码,循环自动跟着数据伸缩。 保存工作簿一定要存成 .xlsm格式,否则宏会丢失。
知识点小结
用 VBA 给表格加序号,本质上就是把「手动从 1 拖到几百、中间还容易断号」这件事,翻译成一段固定动作:找末行 → For 循环从第 2 行跑到末行 → 每行写当前序号、写完加 1 → 弹窗报告填了多少个。三句话记牢就够用:
循环填号 → For i = 2 To 末行 : Cells(i, 列).Value = 序号 : 序号 = 序号 + 1 : Next i,末行用Cells(Rows.Count, 列).End(xlUp).Row自动找;灵活 → 列字母和起始号都能用 InputBox运行时填,Val把输入转成数字,列多大都不用手改;不断号 → 用 If Cells(i, 判断列).Value <> ""跳过空行,只给有内容的行编号,序号永远连续。
它和前面学的「排序」「查找替换」「删除重复行」是一套组合拳:替换管"把写错/不统一的词扶正"、去重管"把重复记录并成一条"、排序管"把乱序数据理顺"、加序号管"给每行一个干净的唯一编号"——从收数、清数、改数、排数到编号,全程不用手动点一下。
【SVG 示意图】
下一篇预告:序号、排序、替换、去重都搞定后,日常还常遇到"要把分散的几列拼成一个完整内容"——比如把"姓"列和"名"列拼成"姓名"列、把"省、市、区"拼成完整地址。下一篇我们继续从网络上抓取新的 VBA 实用技巧,带你解锁「一键把多列内容合并成一列」——用 For…Next 逐行读两列、用 & 拼起来写进新列,自动 End(xlUp) 适配行数。
【往期 VBA 精选】
系列已更新 60+ 篇,挑几篇最实用的继续看:
从0学 Excel VBA 第1篇:认识 VBA,什么是宏?[1] 进销存实战第1篇:系统设计与初始化[2] CRM 客户管理第1篇:系统设计与初始化[3] Excel 一键系列:用 VBA 把表格批量导出成 PDF[4] 界面自定义第1篇:自定义菜单与工具栏[5]
关注公众号「西哥的AI幻觉」,对话框发送「VBA」可获取完整目录与配套源码。
【西哥能帮你做什么】
办公自动化 · AI 视频生产 · AI 编程助手落地 · 工厂数字化
把 Excel / VBA / Python 里那些重复到吐的活,一次性自动化掉 批量产出「古诗每日一诵」式 AI 古诗词视频(配音 + 配图 + 合成一键完成) OpenClaw / WorkBuddy 等 AI 编程助手的企业内训与落地陪跑 从 PLC 到 MES 的工厂务实数字化方案
【找到我】
公众号「西哥的AI幻觉」:点文章右上角「···」设为星标,更新不迷路 加微信:LekonWang(备注「VBA」进学习交流群)
本文由西哥原创,转载请注明出处「西哥的AI幻觉」。















































































