删除不含指定文本的行时触发Run-Time Error 13类型不匹配错误
解决VBA运行时错误13(类型不匹配)问题
你的代码触发Run-Time Error 13的核心原因是:I列中存在非文本类型的单元格(比如公式返回的#N/A、#VALUE!错误值,或是数字、布尔值),直接将这些值与字符串"M"/"S"比较时,会触发类型不匹配。另外原代码还遗漏了对"S+M"的判断。
修正后的代码
Sub DeleteRowsTEST() Dim LastRow As Long, x As Long Dim allowedValues As Variant ' 定义所有允许保留的文本值 allowedValues = Array("M", "S", "M+S", "S+M") ' 获取I列最后一行有效数据行号 LastRow = ActiveSheet.Cells(Rows.Count, "I").End(xlUp).Row ' 从底部向上遍历,避免删除行导致的索引偏移 For x = LastRow To 1 Step -1 With ActiveSheet.Cells(x, "I") ' 先处理错误值单元格,直接删除整行 If IsError(.Value) Then .EntireRow.Delete Else ' 将单元格值转为字符串,检查是否在允许列表内 If IsError(Application.Match(CStr(.Value), allowedValues, 0)) Then .EntireRow.Delete End If End If End With Next x End Sub
关键修改说明
处理非文本/错误值:
- 用
IsError(.Value)先判断单元格是否为错误值,避免后续转换字符串时报错 - 用
CStr(.Value)强制将单元格值转为字符串,确保和允许列表中的字符串类型统一,彻底避免类型不匹配问题
- 用
简化判断逻辑:
- 用数组
allowedValues存储所有允许的文本值,后续新增或修改只需调整数组,无需修改多个And条件 - 用
Application.Match快速判断单元格值是否在允许列表中,代码更简洁易维护
- 用数组
补充遗漏的判断:
- 加入了
"S+M"的判断,覆盖你要求的所有保留场景
- 加入了
额外注意事项
- 运行代码前务必备份工作表,避免误删重要数据
- 如果I列单元格存在前后空格(比如
" M"),可以将CStr(.Value)改为Trim(CStr(.Value)),去除空格后再匹配
内容的提问来源于stack exchange,提问作者Bel
相关产品推荐
相关产品推荐

