You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用条件格式计数列时ISNA(VLOOKUP)求值遇类型不匹配错误13

VBA中使用Application.Evaluate执行ISNA(VLOOKUP)时FALSE结果触发类型不匹配错误13的解决方法

在VBA中执行ISNA(VLOOKUP(...))公式统计符合条件格式的单元格数量时,遇到以下问题:当ISNA返回TRUE(VLOOKUP未找到匹配值)时代码正常运行,返回FALSE(VLOOKUP找到匹配值)时触发类型不匹配错误13。原代码如下:

Sub CF_FAILS()

Dim cellValue As String
Dim cellCount As Long
Dim result As Boolean

'#1 cellValue Returns TRUE AND WORKS

    cellValue = "=ISNA(VLOOKUP($G6,API_RESPONSE,RCI.Item_Lookup,0))"
    result = Application.Evaluate(cellValue)
    If (result) Then
        cellCount = cellCount + 1
    End If

    ActiveSheet.range("A20").Value = result
    
'#2 cellValue Returns FALSE AND FAILS with a TYPE-MISMATCH error
    
    cellValue = "=ISNA(VLOOKUP($G9,API_RESPONSE,RCI.Item_Lookup,0))"
    result = Application.Evaluate(cellValue)  '<== FAILS HERE WITH TYPE-MISMATCH ERROR 13'

    If (result) Then
        cellCount = cellCount + 1
    End If
    
    ActiveSheet.range("A21").Value = result
    
End Sub

问题原因

Application.Evaluate返回的是Variant类型,虽然ISNA函数逻辑上返回布尔值,但当VLOOKUP找到匹配值时,Excel内部的类型处理可能导致返回的Variant无法直接隐式转换为Boolean类型,从而触发类型不匹配错误。

解决方法

方法1:修改变量类型并显式转换布尔值

将result变量的类型从Boolean改为Variant,判断时通过CBool()显式转换为布尔值,避免隐式转换错误:

Sub CF_FIXED_EVALUATE()

Dim cellValue As String
Dim cellCount As Long
Dim result As Variant ' 修改为Variant类型

'#1 正常处理TRUE情况
cellValue = "=ISNA(VLOOKUP($G6,API_RESPONSE,RCI.Item_Lookup,0))"
result = Application.Evaluate(cellValue)
If CBool(result) Then ' 显式转换为布尔值
    cellCount = cellCount + 1
End If
ActiveSheet.Range("A20").Value = result

'#2 修复FALSE情况的类型不匹配
cellValue = "=ISNA(VLOOKUP($G9,API_RESPONSE,RCI.Item_Lookup,0))"
result = Application.Evaluate(cellValue)
If CBool(result) Then
    cellCount = cellCount + 1
End If
ActiveSheet.Range("A21").Value = result

End Sub

方法2:直接使用WorksheetFunction方法(推荐)

绕过Application.Evaluate的字符串公式,直接调用WorksheetFunction.VLookup并通过错误捕获判断是否匹配,更高效且易维护:

Sub CF_FIXED_WORKSHEETFUNCTION()

Dim cellCount As Long
Dim lookupValue As Variant
Dim lookupResult As Variant

'#1 处理G6
lookupValue = ActiveSheet.Range("$G6").Value
On Error Resume Next ' 捕获VLOOKUP未找到的错误
lookupResult = Application.WorksheetFunction.VLookup(lookupValue, ActiveSheet.Range("API_RESPONSE"), RCI.Item_Lookup, False)
If Err.Number <> 0 Then
    ' 未找到匹配,ISNA返回TRUE
    cellCount = cellCount + 1
    ActiveSheet.Range("A20").Value = True
Else
    ' 找到匹配,ISNA返回FALSE
    ActiveSheet.Range("A20").Value = False
End If
On Error GoTo 0 ' 恢复错误捕获

'#2 处理G9
lookupValue = ActiveSheet.Range("$G9").Value
On Error Resume Next
lookupResult = Application.WorksheetFunction.VLookup(lookupValue, ActiveSheet.Range("API_RESPONSE"), RCI.Item_Lookup, False)
If Err.Number <> 0 Then
    cellCount = cellCount + 1
    ActiveSheet.Range("A21").Value = True
Else
    ActiveSheet.Range("A21").Value = False
End If
On Error GoTo 0

End Sub

内容的提问来源于stack exchange,提问作者Davidson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:28:23