Excel ListObject行删除求助:含指定子串的行删除代码语法问题
解决ListObject中删除含特定子串行的VBA语法问题
原代码的核心问题
- 子串判断写法错误:
Find方法返回的是Range对象,不能直接作为If的判断条件;且检查单元格是否包含子串,用Like运算符比Find更直接高效。 - 删除行语法缺失:
tbl.ListRows.Delete未指定目标行,需明确行索引才能正确删除。 - 未处理空表场景:若ListObject无数据行,
tbl.DataBodyRange会触发运行时错误,需提前判断。
修正后的代码(推荐用Like)
Sub removeTax() Dim tbl As ListObject Set tbl = ThisWorkbook.Sheets("Master").ListObjects("tblMaster") Dim myString As String myString = "Tax" Dim rw As Long ' 先检查表是否存在数据行 If Not tbl.DataBodyRange Is Nothing Then ' 从后往前遍历,避免删除行后索引错乱 For rw = tbl.DataBodyRange.Rows.Count To 1 Step -1 ' 用通配符匹配包含目标子串的单元格 If tbl.DataBodyRange(rw, 10).Value Like "*" & myString & "*" Then tbl.ListRows(rw).Delete End If Next rw End If End Sub
若坚持使用Find的正确写法
如果一定要用Find实现,需判断返回的Range对象是否非空,同时指定匹配模式:
Sub removeTax_WithFind() Dim tbl As ListObject Set tbl = ThisWorkbook.Sheets("Master").ListObjects("tblMaster") Dim myString As String myString = "Tax" Dim rw As Long Dim findResult As Range If Not tbl.DataBodyRange Is Nothing Then For rw = tbl.DataBodyRange.Rows.Count To 1 Step -1 ' 设置LookAt为xlPart,匹配单元格内任意位置的子串 Set findResult = tbl.DataBodyRange(rw, 10).Find(What:=myString, LookIn:=xlValues, LookAt:=xlPart) ' 判断是否找到目标子串 If Not findResult Is Nothing Then tbl.ListRows(rw).Delete End If Next rw End If End Sub
关键说明
Like "*Tax*"中的*是通配符,代表任意长度的字符,可匹配包含"Tax"的任意内容。- 从后往前遍历(
Step -1)是为了避免删除行后,后续行的索引偏移导致漏删或报错。 - 提前判断
tbl.DataBodyRange Is Nothing,能避免空表时的运行时错误。
内容的提问来源于stack exchange,提问作者Steve P.
相关产品推荐
相关产品推荐

