VBA遍历工作表时Do While触发1004错误:计数至指定值后删行
问题解决:遍历工作表删除指定值前的行(修复1004错误)
问题场景
需要遍历工作簿所有工作表,在C列找到值为“Empcode”的单元格,删除该单元格上方的所有行。但原代码在Do While语句触发Runtime Error 1004“应用程序定义或对象定义错误”。
原代码:
Public Function StringFormat(ByVal mask As String, ParamArray tokens()) As String Dim i As Long For i = LBound(tokens) To UBound(tokens) mask = Replace(mask, "{" & i & "}", tokens(i)) Next StringFormat = mask End Function Sub delcol() Dim ac As Integer Dim j As Long Dim a As Long 'counting the worksheets ac = Application.Worksheets.Count 'looping through the worksheets For i = 1 To ac Worksheets(i).Activate j = 1 a = 0 'counting the no of rows until value - "Empcode" occurs Do While Cells(j, 3).Value <> "Empcode" a = a + 1 j = j + 1 Loop Range(StringFormat("a1:a{0}", a)).EntireRow.Delete Next i End Sub
错误原因
- 变量未声明:循环变量
i未在代码中声明,可能引发作用域冲突 - 无限循环风险:如果工作表C列中没有“Empcode”,
Do While会一直执行到超出工作表最大行数,访问不存在的单元格导致1004错误 - 未明确指定工作表对象:
Cells(j,3)和Range默认指向当前活动工作表,若激活操作失效会导致对象引用错误 - 低效的行删除方式:自定义
StringFormat函数完全没必要,可直接通过行号范围操作
修正后的代码
Sub DeleteRowsBeforeEmpcode() Dim ws As Worksheet Dim empcodeCell As Range '遍历所有工作表 For Each ws In ThisWorkbook.Worksheets '在C列查找"Empcode",匹配整个单元格内容 Set empcodeCell = ws.Columns(3).Find(What:="Empcode", LookIn:=xlValues, LookAt:=xlWhole) If Not empcodeCell Is Nothing Then '如果找到目标值,删除该行之前的所有行 If empcodeCell.Row > 1 Then ws.Rows("1:" & empcodeCell.Row - 1).Delete End If Else '可选:如果没找到目标值,给出提示 MsgBox "工作表" & ws.Name & "中未找到Empcode", vbExclamation End If Next ws End Sub
代码说明
- 使用
For Each ws In ThisWorkbook.Worksheets直接遍历工作表,无需激活,避免对象引用错误 - 用
Find方法高效定位目标单元格,避免无限循环 - 明确判断找到的单元格行号,若行号大于1才执行删除操作,避免删除空行或目标行本身
- 增加未找到目标值的提示,方便排查问题
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

