Excel VBA排序删行时报运行时错误'13'类型不匹配求助
VBA宏运行时错误13(类型不匹配)修复方案
原宏预期实现功能:
- 对H列存储的p值进行升序排序
- 删除所有p值
>=0.05的对应行 - 在I列逐行填充B列与E列的差值,规则为
In = Bn - En(n为行号) - 最终按I列的差值内容完成升序排序
原代码执行到删除符合条件行的语句时中断,报错信息:
Run-time error '13':
Type mismatch(运行时错误'13':类型不匹配)
错误根因
原代码查找0.05分界点的Match逻辑存在边界漏洞:
- 第一次精确匹配查找仅能定位恰好等于0.05的单元格,如果H列不存在刚好等于0.05的p值,会直接返回错误值
- 第二次模糊匹配要求查找区域严格升序,且当H列所有p值都小于0.05时,依然会返回错误值
- 当变量
m被赋值为错误值时,传入Cells方法作为行号参数会直接触发类型不匹配错误 - 原代码还存在隐藏逻辑问题:删除行后行号发生偏移,后续给I列填充公式的范围会出现错位
修复后完整代码
Sub sort1() Dim m As Long Dim lastRow As Long Dim i As Long With ActiveSheet ' 删除前6行冗余内容 .Range("1:6").EntireRow.Delete Shift:=xlUp ' 给I列添加表头 .Range("I1") = "diff" ' 第一步:按H列p值升序排序 With .Range("A:I") .Sort Key1:=.Columns(8), Order1:=xlAscending, Header:=xlYes End With ' 定位H列最后一行有效数据 lastRow = .Cells(.Rows.Count, "H").End(xlUp).Row ' 默认所有p值都小于0.05,无需要删除的行 m = lastRow + 1 ' 逐行查找第一个p值>=0.05的行位置 For i = 2 To lastRow If IsNumeric(.Cells(i, "H").Value) And .Cells(i, "H").Value >= 0.05 Then m = i Exit For End If Next i ' 存在符合删除条件的行时再执行删除操作 If m <= lastRow Then .Range(.Cells(m, "A"), .Cells(.Rows.Count, "A")).EntireRow.Delete Shift:=xlUp End If ' 删除行后重新定位有效数据最后一行,避免公式填充范围错位 lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row ' 给I列填充B-E的差值公式 If lastRow >= 2 Then .Range("I2:I" & lastRow).FormulaR1C1 = "=RC[-7]-RC[-4]" End If ' 强制重算公式 .Calculate ' 最后按I列差值升序排序 With .Range("A:I") .Sort Key1:=.Columns(9), Order1:=xlAscending, Header:=xlYes End With End With End Sub
修复说明
- 替换不稳定的
Match查找逻辑为逐行遍历判断,兼容「无恰好等于0.05的p值」「所有p值都小于0.05」「H列存在非数值内容」等边界场景 - 增加删除前置判断,仅当存在符合条件的行时才执行删除操作,避免传入无效行号
- 删除行后重新获取有效数据范围,解决原代码公式填充错位的问题
- 调整变量类型为数值类型,从根源避免类型不匹配问题
内容的提问来源于stack exchange,提问作者Екатерина Самойлова
相关产品推荐
相关产品推荐

