夜雨聆风学习资料网

ARTICLE · 1319405

Excel小技巧:用「ROW 函数」做动态序号,删行也不会断号

Excel小技巧:用「ROW 函数」做动态序号,删行也不会断号

当你在 A 列手动填了 1、2、3、4、5……给每行数据编了个号。

然后你发现第 8 行是重复数据,右键 → 删除整行。

删完之后一看:序号从 7 直接跳到了 9。中间缺了个 8,后面全没对上。

你要么手动把后面的序号全部改一遍,要么拖着不管——反正只是个编号,缺一个也不影响数据。但如果这张表要交给领导看、或者要导入系统,序号不连续就是不行。

今天教你一个一劳永逸的方法:用 ROW 函数自动生成序号。不管你插入行还是删除行,序号永远连续、永远从 1 开始。

ROW 函数是什么

ROW 函数极其简单,它只做一件事:返回当前单元格的行号。

=ROW()

在 A5 单元格里写这个公式,结果就是 5。在 A10 里写,结果就是 10。

你可能会想:这有什么用?我直接在 A1 写 1、A2 写 2、然后往下拖不就行了?

区别在于:手写的 1、2、3 是固定值,删了一行就断了。而 ROW() 返回的是"当前在第几行",它是一个动态计算的结果——删了一行之后,下面的行自动上移,行号自动变化,ROW() 的结果也就自动更新了。

从行号到序号:减一个偏移量

直接用 ROW() 有个问题:如果你的数据不是从第 1 行开始的,序号就不从 1 开始。

比如你的表头占了第 1 行,数据从第 2 行开始。在 A2 写 =ROW(),结果是 2,但你需要的是 1。

解决方法很简单:减去表头占用的行数。

=ROW()-1

在 A2 写这个公式,结果就是 2-1=1。往下拖,A3 就是 3-1=2,A4 就是 4-1=3。完美。

如果表头占了两行(第 1 行是大标题,第 2 行是列名),数据从第 3 行开始:

=ROW()-2

规律就是:=ROW() 减去(数据起始行上面的行数)。

更稳健的写法:用减法引用表头行

上面的写法有一个小问题:如果你在表头区域插入了一行(比如在标题和列名之间加了一行空行),数据起始行从第 3 行变成了第 4 行,公式里的 -2 就不对了,要改成 -3。

更稳健的写法是用一个引用单元格来代替硬编码的数字:

=ROW()-ROW($A$表头最后一行)

$A$1 是表头的第一行。这个公式的意思是"当前行号减去表头行号"。不管表头占了几行、不管你在哪里插入了新行,这个公式都能自动算出正确的序号。

如果你想做得更极致——让序号完全不依赖于表头行数,可以用这种写法:

=ROW()-ROW(表头单元格)-1+1

不过大多数情况下 =ROW()-ROW($A$表头最后一行) 已经够用了。

三种进阶场景

场景一:每隔一行显示序号(隔行编号)

如果你希望奇数行显示序号、偶数行留空(用于填写备注之类的),可以用 ROW 配合 MOD 函数:

=IF(MOD(ROW(),2)=1, INT((ROW()-1)/2)+1, "")

第 1 行显示 1,第 2 行空白,第 3 行显示 2,第 4 行空白……

场景二:合并单元格后序号仍然连续

合并单元格是序号的大敌。如果 A 列有些单元格被合并了,手动编号会乱,普通公式也会出错。

解决方法:不依赖行号,改用 COUNTA 函数统计非空单元格来编号。

=IF(B2<>"", COUNTA($B$2:B2), "")

B 列是关键标识列(比如"客户名称",有数据就编号、空着就不编号)。这个公式的意思是:“如果 B2 有内容,就统计从 B2 到当前行有多少个非空单元格,作为序号。”

这种方式的好处是:不管中间有没有合并单元格、有没有空行,序号始终连续。

场景三:筛选后序号仍然从 1 开始

普通序号在筛选之后会显示不连续的编号(比如筛出来的是第 3、7、12 行,序号显示 3、7、12)。如果你想让筛选后的序号从 1 开始重新编,用 SUBTOTAL 函数:

=SUBTOTAL(3, $B$2:B2)

3 代表 COUNTA 的统计方式,但 SUBTOTAL 会自动忽略被筛选隐藏的行。所以筛选后你看到的序号就是 1、2、3……连续的。取消筛选后,序号又恢复成完整的连续编号。

和其他序号方案的对比

选择建议:

  • 只是日常使用、不筛选不合并 → ROW()-N,最简单
  • 需要筛选后序号连续 → SUBTOTAL
  • 有合并单元格 → COUNTA 方案
  • 一劳永逸、什么场景都能用 → 组合使用 SUBTOTAL + COUNTA

一个完整的实战模板

假设你有一张客户订单表:

  • 第 1 行:标题"2026年11月订单明细"
  • 第 2 行:表头(序号、日期、客户、产品、金额、备注)
  • 第 3 行起:数据

在 A3(序号列第一行)写公式:

=SUBTOTAL(3, $C$3:C3)

C 列是客户名称列(每行必填的字段)。这个公式的效果:

  • 自动从 1 开始编号
  • 删除中间某行后,序号自动重排
  • 插入新行并填写客户名称后,序号自动更新
  • 筛选之后,序号从 1 开始连续显示
  • 不受合并单元格影响(只要 C 列没有合并)

一行公式,覆盖所有常见场景。

几个容易踩的坑

第一,ROW()-N 里的 N 要算对。 数据从第几行开始,N 就是"起始行号 - 1"。数据从第 3 行开始,N=2。如果表头行数改了(比如加了个副标题),公式里的 N 也要跟着改。用 =ROW()-ROW($A$表头最后一行) 的写法可以避免这个问题。

第二,SUBTOTAL 的第一个参数别选错。 3 代表 COUNTA(计数非空单元格),适合用来编号。如果你写成 9(代表 SUM),它会去求和而不是计数。常用值:1=AVERAGE,2=COUNT(只数数字),3=COUNTA(数非空),9=SUM。

第三,COUNTA 方案会把公式本身的单元格也算进去。 如果你在 B 列用了公式(比如 =IF(…,“张三”,“”)),即使 IF 的结果是空字符串 “”,COUNTA 也会认为它"非空"(因为有公式在)。这种情况下用 COUNTBLANK 或者换一种判断方式。

第四,绝对引用别忘了。=ROW()-ROW($A$表头最后一行) 里的 $A$1 必须是绝对引用(带 $)。如果写成了 A1,公式往下拖的时候 A1 会变成 A2、A3……偏移量就不对了。

第五,删除行之后如果序号没更新,按一下 F9。 正常情况下删除行后公式会自动重算。但如果你的 Excel 设置成了"手动计算"模式(文件 → 选项 → 公式 → 计算选项 → 手动),公式不会自动更新。按 F9 手动触发重算,或者改回"自动计算"模式。

今天的总结

动态序号的核心公式就一个:

=ROW()-ROW($A$表头最后一行)

当前行号减去表头行号,得到从 1 开始的连续序号。插入行、删除行,序号自动调整,永远不断。

需要筛选后也从 1 开始?换成:

=SUBTOTAL(3, $关键列$起始行:关键列当前行)

一行公式,告别手动编号的痛苦。

下次做表的时候,别再手动填 1、2、3 了。花 10 秒写一个 ROW 公式,以后不管怎么增删数据,序号永远是连续的。这个小习惯看起来不起眼,但它能帮你避免无数次"删了一行、序号全乱了"的抓狂时刻。


——E晓分享,共同进步——

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

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

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

相关学习资料