Excel VBA调用FILTER函数用*运算报类型不匹配错误如何解决?
错误原因
- VBA中调用工作表
Search函数时,无匹配结果会返回错误值而非空值,错误值无法直接参与乘法运算,直接计算就会触发类型不匹配(运行时错误13) - 工作表公式里的
ISNUMBER可以自动识别错误值返回FALSE,但VBA调用Application.IsNumber处理带错误值的数组时,错误值的运算逻辑和工作表不一致,无法自动跳过错误完成计算。
解决方案
方案1:直接用Evaluate执行原有公式(最简便)
直接通过VBA的Evaluate方法运行你已经验证可用的工作表公式,不需要调整原有逻辑,兼容性最好:
Dim Res As Variant Dim wsTool As Worksheet, wsDb As Worksheet Set wsTool = Sheets("Tool") Set wsDb = Sheets("Database") ' 直接执行工作表公式,规避逐函数调用的兼容问题 Res = Evaluate("FILTER(" & wsDb.Name & "!A2:C1947,ISNUMBER(SEARCH(" & _ wsTool.Range("G3").Address(External:=True) & "," & wsDb.Name & "!A2:A1947)*" & _ "SEARCH(" & wsTool.Range("G4").Address(External:=True) & "," & wsDb.Name & "!A2:A1947)),""Not found"")")
方案2:改用VBA原生逻辑生成筛选条件
如果不想拼接公式,可以用VBA原生InStr函数生成筛选条件数组,再调用Filter函数,性能更稳定:
Dim Res As Variant Dim arrFilter As Variant Dim i As Long Dim key1 As String, key2 As String Dim wsDb As Worksheet, wsTool As Worksheet Set wsDb = Sheets("Database") Set wsTool = Sheets("Tool") key1 = wsTool.Range("G3").Value key2 = wsTool.Range("G4").Value ' 生成筛选条件数组 ReDim arrFilter(1 To 1946, 1 To 1) ' A2到A1947一共1946行 For i = 1 To 1946 ' vbTextCompare对应SEARCH的不区分大小写特性,需要区分大小写可改为vbBinaryCompare arrFilter(i, 1) = InStr(1, wsDb.Cells(i + 1, "A").Value, key1, vbTextCompare) > 0 And _ InStr(1, wsDb.Cells(i + 1, "A").Value, key2, vbTextCompare) > 0 Next i ' 执行筛选 Res = Application.Filter(wsDb.Range("A2:C1947"), arrFilter, "Not found")
后续使用说明
两种方案返回的Res都是二维数组,可以直接批量写入单元格区域,示例:
' 把结果从Tool表A6单元格开始写入 wsTool.Range("A6").Resize(UBound(Res, 1), UBound(Res, 2)).Value = Res
内容的提问来源于stack exchange,提问作者gaurav
相关产品推荐
相关产品推荐

