为何相同的VBA删除行代码仅能成功运行一次?
问题分析与解决
报错原因
你遇到的运行时错误'1004':对象'_Worksheet'的方法'Range'失败,核心原因是:
- 第一次执行
Delete后,firstrowDS3和lastrowDS2这两个Range对象指向的单元格已经被删除,它们的引用变成了无效状态。第二次再用这两个无效对象创建Range时,Excel找不到对应的单元格,直接抛出错误。 - 原代码中
Range("H1000")没有指定工作表,可能会意外引用当前活动工作表,而非你指定的ARDetail工作表,也会增加出错概率。
修正方案
方案1:每次删除前重新定位范围
既然删除行后之前的Range引用会失效,那每次删除前重新获取要删除的空行范围即可:
Dim ws As Worksheet Set ws = ARDetail Dim lastrowDS3 As Range Dim firstrowDS3 As Range Dim lastrowDS2 As Range ' 第一次删除:重新定位目标范围 Set lastrowDS3 = ws.Range("H1000").End(xlUp).Offset(-2, 0) Set firstrowDS3 = lastrowDS3.End(xlUp).Offset(-1, 0) Set lastrowDS2 = firstrowDS3.End(xlUp).Offset(0, -7) ws.Range(firstrowDS3, lastrowDS2).Delete ' 第二次删除:再次重新定位(因为行已被删除,之前的引用无效) Set lastrowDS3 = ws.Range("H1000").End(xlUp).Offset(-2, 0) Set firstrowDS3 = lastrowDS3.End(xlUp).Offset(-1, 0) Set lastrowDS2 = firstrowDS3.End(xlUp).Offset(0, -7) ws.Range(firstrowDS3, lastrowDS2).Delete
方案2:通用自动删除分隔空行
如果要处理任意数量的分隔空行,推荐用从下往上遍历的方式,避免删除行导致的索引错乱,自动识别并删除所有连续空行:
Dim ws As Worksheet Set ws = ARDetail Dim lastRow As Long Dim i As Long ' 获取H列最后一行数据的行号 lastRow = ws.Cells(ws.Rows.Count, "H").End(xlUp).Row ' 从下往上遍历,防止删除行后索引混乱 For i = lastRow To 1 Step -1 ' 判断当前行是否为空(可根据实际数据调整判断条件,比如检查整行是否为空) If ws.Cells(i, "H").Value = "" Then Dim emptyStart As Long emptyStart = i ' 向上查找连续空行的起始行 Do While emptyStart > 1 And ws.Cells(emptyStart - 1, "H").Value = "" emptyStart = emptyStart - 1 Loop ' 删除连续空行 ws.Rows(emptyStart & ":" & i).Delete i = emptyStart ' 调整循环索引,避免重复处理 End If Next i
内容的提问来源于stack exchange,提问作者4everLearning
相关产品推荐
相关产品推荐

