在工作表指定区域查找字符串以删除行的VBA宏问题
EMC标准模板行处理VBA宏修复
需求说明
我有一个测试软件生成报告用的模板,软件可导入测量结果并运行小型宏。模板包含测试的所有可能限值,需根据实际采用的EMC标准删除未使用的限值,判断逻辑如下:
- 若标准列表(单元格区域
E8:J9)包含55015,保留所有行; - 若不含
55015,但包含55032或55014,删除第68、69行,同时在第100、101行插入空行。
尝试过的代码
代码版本1
Sub Define_Limit() If InStr(Range("E8:J9").Value, "*55015*") = 0 Then If (InStr(Range("E8:J9").Value, "*55032*") = 1 Or InStr(Range("E8:J9").Value, "*55014*") = 0) Then Cells(68, 2).EntireRow.Delete 'deleting the row with extra limits i.e. 9k-->150KHz Cells(69, 2).EntireRow.Delete Cells(100, 2).EntireRow.Insert Cells(101, 2).EntireRow.Insert End If End If End Sub
代码版本2(片段)
If (((CountIf("E8:J9", "*55032*"),True,False) = True) Or (CountIf("E8:J9", "*55014*"),True,False) = True) Then If (((CountIf("E8:J9", "*55015*"),True,False) = False)) Then Cells(68, 2).EntireRow.Delete 'deleting the row with extra limits i.e. 9k-->150KHz Cells(69, 2).EntireRow.Delete
问题分析
原代码存在多处错误:
InStr不支持通配符*,直接传入*55015*会把*当作普通字符,无法匹配包含目标字符串的内容;- 多单元格区域的
.Value返回数组,直接传入InStr会触发类型错误; - 版本2中
CountIf调用语法错误,VBA需通过WorksheetFunction.CountIf调用工作表函数,且参数格式不符合要求; - 逻辑判断错误:版本1的
Or条件写反,应该是包含55032或包含55014,而非包含55032或不包含55014。
修正后的代码
Sub Define_Limit() Dim has55015 As Boolean Dim has55032Or55014 As Boolean '检查区域是否包含55015 has55015 = (WorksheetFunction.CountIf(Range("E8:J9"), "*55015*") > 0) '检查区域是否包含55032或55014 has55032Or55014 = (WorksheetFunction.CountIf(Range("E8:J9"), "*55032*") > 0) Or _ (WorksheetFunction.CountIf(Range("E8:J9"), "*55014*") > 0) '执行目标逻辑 If Not has55015 And has55032Or55014 Then '从下往上删行,避免行号偏移导致漏删 Rows("69:69").Delete Rows("68:68").Delete '一次性插入两行,简化操作 Rows("100:101").Insert End If End Sub
修正说明
- 用
WorksheetFunction.CountIf配合通配符*检测区域内的目标字符串,计数大于0即表示存在; - 定义布尔变量存储判断结果,让逻辑更清晰易读;
- 删除行时从后往前操作,避免删除上方行后下方行号偏移,导致漏删;
- 用
Rows("100:101").Insert一次性插入两行,简化代码。
内容的提问来源于stack exchange,提问作者TeaBot
相关产品推荐
相关产品推荐

