Excel VBA调用Match无匹配报运行时错误13类型不匹配如何解决
问题解决方法
核心错误原因
触发运行时错误13的根本原因是变量类型不兼容:
- 你声明了
MaterialDatenbankZeile As Integer,但Application.Match方法在未匹配到目标值时,返回的是Error类型的结果,Integer类型变量无法接收Error值,直接触发类型不匹配。 - 额外隐患:代码中使用
Application.WorksheetFunction.Match时,如果未匹配到值会直接抛出运行时错误,没有后续判断的机会;同时Integer类型最大仅支持数值到32767,当数据行号超过该值时会出现溢出错误。
修正方案
只需要调整几处变量声明和写法即可,修正后的完整代码如下:
Sub Traceability() ' 直接指定工作表,不需要Activate切换避免引用错误 Dim wsMaterial As Worksheet, wsUebersicht As Worksheet Set wsMaterial = Worksheets("Materialien") Set wsUebersicht = Worksheets("Uebersicht") Dim GescanntesEndgeraet As Variant Dim GescanntesMaterial As Variant ' 匹配相关变量用Variant支持接收错误值,行号用Long避免溢出 Dim ZeileEndgeraetStart As Variant Dim ZeileEndgeraetEnd As Long Dim MaterialDatenbankZeile As Variant Dim MaterialDatenbank As Variant Dim MaterialienRange As Range GescanntesEndgeraet = wsUebersicht.Cells(7, "C").Value GescanntesMaterial = wsUebersicht.Cells(11, "C").Value ' 匹配设备行号,增加未匹配到的错误处理 ZeileEndgeraetStart = Application.Match(GescanntesEndgeraet, wsMaterial.Range("A:A"), 0) If IsError(ZeileEndgeraetStart) Then wsUebersicht.Cells(7, "F").Value = "false" Exit Sub End If ZeileEndgeraetEnd = ZeileEndgeraetStart + Application.WorksheetFunction.CountIf(wsMaterial.Range("A:A"), GescanntesEndgeraet) - 1 Set MaterialienRange = wsMaterial.Range("B" & ZeileEndgeraetStart & ":B" & ZeileEndgeraetEnd) ' 此时MaterialDatenbankZeile是Variant类型,可以正常接收错误值 MaterialDatenbankZeile = Application.Match(GescanntesMaterial, MaterialienRange, 0) If IsError(MaterialDatenbankZeile) Then MaterialDatenbank = "A" Else MaterialDatenbankZeile = MaterialDatenbankZeile + ZeileEndgeraetStart - 1 MaterialDatenbank = wsMaterial.Cells(MaterialDatenbankZeile, "B").Value End If If MaterialDatenbank = GescanntesMaterial Then wsUebersicht.Cells(7, "F").Value = "true" Else wsUebersicht.Cells(7, "F").Value = "false" End If wsUebersicht.Activate End Sub
关键修改说明
- 将
MaterialDatenbankZeile的声明类型从Integer改为Variant,可以同时接收匹配成功的行号数值和匹配失败的Error值,你的原有IsError判断逻辑就能正常生效,不会半路报错。 - 新增了工作表对象变量,所有范围引用都绑定到对应工作表,避免
Activate切换表带来的范围引用错误。 - 设备号匹配改用
Application.Match并增加错误判断,当输入的设备号不存在时也不会直接报错,直接返回false结果。 - 行号相关变量改用
Long或Variant,避免行号超过32767时的溢出错误。
内容的提问来源于stack exchange,提问作者Pumluk
相关产品推荐
相关产品推荐

