Excel技术需求:查找行内最后非空单元格后的首个空单元格
嘿,刚好之前帮朋友解决过一模一样的需求!不管行首有没有空单元格,都能精准找到目标位置,给你俩实用的解法,按需选就行:
一、公式解法(无需代码,直接用)
1. 通用公式(兼容所有Excel版本)
这个公式不管你是新的365/2021还是旧版Excel都能用,直接就能拿到目标单元格的列号:=LOOKUP(2,1/(ROW_NUMBER:ROW_NUMBER<>""),COLUMN(ROW_NUMBER:ROW_NUMBER))+1
把里面的ROW_NUMBER换成你要查的行号就行,比如查第20行就是:=LOOKUP(2,1/(20:20<>""),COLUMN(20:20))+1
要是想直接拿到单元格的地址(比如E20),就用这个:=ADDRESS(20,LOOKUP(2,1/(20:20<>""),COLUMN(20:20))+1)
原理简单说下:
20:20<>""会生成一个数组,非空单元格对应TRUE,空单元格对应FALSE1/(...)把TRUE转成1,FALSE转成错误值(因为1除以0会报错)LOOKUP(2, ...)会在数组里找最靠近2的有效值,也就是最后一个1,对应最后一个非空单元格的列号,加1就是后面第一个空单元格的列啦!
举你的例子:第20行最后一个非空在D20(列4),公式返回4+1=5,对应E20;第21行最后一个非空在B21(列2),返回3,对应C21,完美匹配需求。
2. Excel 365/2021专属简化版
如果你的Excel支持动态数组,还可以用更简洁的XLOOKUP写法:
列号公式:=XLOOKUP(TRUE,ISBLANK(20:20),COLUMN(20:20),,1,ROW(INDIRECT("1:"&COLUMNS(20:20))))
这个是从后往前找第一个空单元格,刚好就是最后一个非空之后的那个空,效果和上面的公式一样,看你习惯用哪个。
二、VBA解法(适合批量/自动化)
要是需要批量处理好多行,或者想做成自定义函数一键调用,VBA就很方便了:
按Alt+F11打开VBA编辑器,插入一个新模块,粘贴这段代码:
Function NextEmptyCell(rowNum As Long) As String ' 找到该行最后一个非空单元格的列号 Dim lastNonEmptyCol As Long lastNonEmptyCol = Cells(rowNum, Columns.Count).End(xlToLeft).Column ' 返回下一个空单元格的地址 NextEmptyCell = Cells(rowNum, lastNonEmptyCol + 1).Address End Function
回到Excel里,直接输入=NextEmptyCell(20)就能得到E20的地址,输入=NextEmptyCell(21)就得到C21,超省心!
小提醒
- 如果整行全是空的,公式和VBA都会返回A列的地址,这是合理的(毕竟第一个空单元格就是A列)
- 如果该行最后一个单元格(XFD列)是非空的,那公式会返回超出范围的列号,Excel会报错,使用的时候注意这种极端情况就行~
内容的提问来源于stack exchange,提问作者Hamouza

