Excel VBA获取指定列首个空白行行号及1004报错解决
问题分析
原代码依赖SpecialCells(xlCellTypeBlanks)查找空白单元格,但当E列从E2到最后一行完全没有空白单元格时,该方法找不到目标对象,就会触发“运行时错误'1004'”。另外,原代码中NextFree - 1的逻辑和你的需求不符——你需要的是首个空白行号(如23496),但该代码输出的是最后有值行的行号(23495)。
解决方案:可靠的替代代码
推荐使用End(xlUp)方法,它能精准定位列中最后一个有数据的单元格,不受中间空白或全列满数据的影响,适配2万条级别的数据量:
Sub GetNextBlankRow() Dim wsBajada As Worksheet Dim lastDataRow As Long Dim nextBlankRow As Long ' 定义工作表对象,减少重复调用开销 Set wsBajada = ThisWorkbook.Worksheets("Bajada") ' 从E列最底部往上定位最后一个非空单元格的行号 lastDataRow = wsBajada.Cells(wsBajada.Rows.Count, "E").End(xlUp).Row ' 首个空白行 = 最后有数据行 + 1 nextBlankRow = lastDataRow + 1 ' 将结果写入Muestra工作表的O10单元格 ThisWorkbook.Worksheets("Muestra").Range("O10").Value = nextBlankRow End Sub
代码说明
wsBajada.Rows.Count:获取当前工作表的总行数,兼容不同Excel版本的行数差异End(xlUp):模拟手动按Ctrl+↑的操作,快速定位最后一个非空单元格- 若E列完全为空,
lastDataRow会返回1(Excel默认起始行),nextBlankRow自动设为2,符合从E2开始的需求
修复原代码的备选方案
如果要基于原代码修改,可添加错误捕获机制处理无空白单元格的情况:
Sub Main_Fixed() Dim NextFree As Long ' 开启错误捕获,避免找不到空白单元格时报错 On Error Resume Next NextFree = Worksheets("Bajada").Range("E2:E" & Rows.Count).SpecialCells(xlCellTypeBlanks).Row On Error GoTo 0 ' 关闭错误捕获 ' 若未找到空白单元格(E2到末尾全有数据),计算最后一行的下一行 If NextFree = 0 Then NextFree = Worksheets("Bajada").Cells(Rows.Count, "E").End(xlUp).Row + 1 End If ' 直接输出NextFree即可,无需减1,匹配你要首个空白行号的需求 Worksheets("Muestra").Range("O10").Value = NextFree End Sub
内容的提问来源于stack exchange,提问作者Sebastián Frades
相关产品推荐
相关产品推荐

