为何使用多年的VBA宏突然出现Runtime error 13类型不匹配错误?
解决VBA“Runtime error 13 类型不匹配”问题
问题根源
代码里直接用CDbl()强制转换单元格值,当C2:C69、D2:D69、D96这些区域存在非数值内容(空值、文本、错误值如#N/A)时,转换操作会失败,触发类型不匹配错误。另外原代码存在重复判断逻辑,也没有处理非数值单元格的情况。
修复后的代码
Sub PayALL_ByDate1() Dim oRng As Range Dim i As Long Dim dblRes As Double Dim dOffsetVal As Variant Dim dD96Val As Variant Dim cCellVal As Variant Set oRng = Range("C2:C69") '提前处理D96的值,判断是否为有效数字 dD96Val = Range("D96").Value If Not IsNumeric(dD96Val) Then dD96Val = 0 '非数字时默认设为0,可根据需求调整 Else dD96Val = CDbl(dD96Val) End If For i = 1 To oRng.Cells.Count '处理D列对应单元格的值 dOffsetVal = oRng(i).Offset(0, 1).Value If IsNumeric(dOffsetVal) Then dOffsetVal = CDbl(dOffsetVal) Else dOffsetVal = -1 '设为小于默认D96的值,跳过后续判断 End If '处理C列单元格的值 cCellVal = oRng(i).Value If Not IsNumeric(cCellVal) Then cCellVal = 0 '非数字内容不计入总和 Else cCellVal = CDbl(cCellVal) End If '简化逻辑,避免重复判断 If (oRng(i).Font.ColorIndex = 1 Or oRng(i).Font.ColorIndex = xlColorIndexAutomatic) And _ dOffsetVal <= dD96Val And _ InStr(oRng(i).Offset(0, 3), ChrW(8730)) = 0 Then dblRes = dblRes + cCellVal End If Next i Application.EnableEvents = False Range("D89") = dblRes Application.EnableEvents = True End Sub
关键修复点
- 提前校验
D96的数值有效性,避免转换失败; - 对循环中涉及的每个单元格值做
IsNumeric()判断,确保只有有效数值才参与计算; - 简化原代码的重复判断逻辑,减少冗余;
- 对非数值内容设置默认处理规则,可根据实际业务需求调整(比如改为提示用户而非跳过)。
额外排查建议
- 检查
C2:C69、D2:D69、D96区域,确认是否存在空格、备注文本、错误值等非数值内容; - 确认这些单元格的格式为“数值”而非“文本”;
- 如果是共享工作簿,排查是否有其他用户修改过单元格内容或格式。
内容的提问来源于stack exchange,提问作者tobyz95
相关产品推荐
相关产品推荐

