VBA用Application.Match时出现运行时错误'13'类型不兼容求助
解决VBA运行时错误'13':类型不兼容的问题
这个运行时错误13的问题我太熟悉了——核心原因是你对Application.Match的返回值特性理解有偏差,咱们一步步拆解解决:
错误根源
Application.Match的返回值不是布尔值:
- 当找到匹配项时,它返回匹配的行号(数值类型)
- 当找不到匹配项时,它返回错误值(Error 2042)
你原代码里直接把Application.Match(...)放在And后面,相当于让VBA把「数值/错误值」和前面的「布尔值(单元格是否非空)」做逻辑运算,这就触发了类型不兼容的错误。
修正方案
我们需要用IsError()函数来判断Match的结果是否为错误值,同时建议先把单元格的值存入变量,提升代码效率和可读性:
Dim cellValue As Variant Dim matchResult As Variant ' 先把目标单元格的值存入变量,避免多次访问工作表 cellValue = Tabelle3.Cells(7 + i, 1).Value ' 调整条件:先判断单元格非空,再判断匹配结果不是错误值(即找到匹配) If cellValue <> "" And Not IsError(Application.Match(cellValue, Tabelle8.Range("A:A"), False)) Then ' 这里写入满足两个条件后的执行逻辑 Else ' 任一条件不满足,跳过当前i(可以直接省略Else,循环会自动进入下一次迭代) End If
额外注意事项
- 用
Variant类型存储cellValue和matchResult:因为单元格值可能是文本、数值等多种类型,而Match的结果可能是数值或错误值,Variant能兼容这些情况。 - 如果需要排除公式返回的空文本或者空格组成的内容,可以把
cellValue <> ""替换为Trim(cellValue) <> "",这样更严谨。 - 如果你习惯用工作表函数的写法,也可以用
WorksheetFunction.Match,但它找不到匹配时会直接抛出错误,需要用On Error Resume Next来捕获,相对来说Application.Match配合IsError()的写法更灵活。
内容的提问来源于stack exchange,提问作者HPM
相关产品推荐
相关产品推荐

