Excel宏:多条件行删除时遇‘行续接过多’错误的解决需求
Excel宏:多条件行删除时遇‘行续接过多’错误的解决需求
嘿,我完全懂你的困扰!你现在要做的是删掉第5列里不包含指定30个值的行,还得保留表头,但原来的写法用了一堆下划线续行来连And条件,结果触发了VBA的「行续接过多」错误——毕竟VBA对单条语句的续行数量是有限制的(最多24个),30个条件肯定超了,而且这么写代码也太啰嗦,以后改条件都要疯。
给你几个更靠谱的解决办法,不仅能搞定错误,代码还更好维护:
方法一:用数组存允许的值(最通用,支持任意数量/长度的关键词)
这是我最推荐的写法,不管你有30个还是50个条件都没问题,而且以后要加改值直接改数组就行:
Sub DeleteRow() Dim row_count As Long Dim i As Long Dim ws As Worksheet Dim my_string As String Dim allowedValues As Variant Dim isMatch As Boolean Dim val As Variant ' 把你要保留的30个值全放进数组里,替换成你实际的内容就行 allowedValues = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", _ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", _ "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD") Set ws = ThisWorkbook.Sheets("Test") row_count = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 重点:从下往上循环删行!比原来的Do While高效,还不用处理i=i-1的麻烦 For i = row_count To 2 Step -1 my_string = ws.Cells(i, 5).Text isMatch = False ' 先默认不匹配 ' 循环检查每个允许的值 For Each val In allowedValues If InStr(my_string, val) > 0 Then isMatch = True Exit For ' 找到匹配就立刻跳出,不用白查剩下的 End If Next val ' 要是一个匹配的都没找到,就删行 If Not isMatch Then ws.Rows(i).EntireRow.Delete End If Next i End Sub
为啥这个写法好?
- 彻底避开了行续接的限制,多少个条件都不怕
- 从下往上删行,不用像原来那样删完行还要调i的值,逻辑更简单
- 不用依赖
ws.Activate激活工作表,直接引用对象更可靠,避免切换工作表时出错 - 维护方便,以后要加/减允许的值,直接改数组就行,不用动判断逻辑
方法二:用Like操作符(适合所有允许值都是单个字符的情况)
如果你要保留的都是单个字符(比如A-Z这种),可以用Like写个匹配模式,代码更短:
Sub DeleteRow_Like() Dim row_count As Long Dim i As Long Dim ws As Worksheet Dim my_string As String Dim allowedPattern As String ' 把所有允许的单个字符放进[]里,Like会匹配包含其中任意一个的内容 allowedPattern = "*[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*" ' 替换成你实际的30个单字符 Set ws = ThisWorkbook.Sheets("Test") row_count = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = row_count To 2 Step -1 my_string = ws.Cells(i, 5).Text ' 要是不匹配模式就删行 If Not my_string Like allowedPattern Then ws.Rows(i).EntireRow.Delete End If Next i End Sub
不过注意哦,这个方法只适合单个字符的情况,如果你的允许值有多个字符(比如"AA"、"XYZ"),Like的模式就不好写了,还是用方法一更稳妥。
备注:内容来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

