如何解决VBA调用VLookup函数时持续出现错误13的问题
VBA调用VLookup报错误13(类型不匹配)的解决方案
错误13为类型不匹配,你的代码存在以下几处问题:
- 基础语法错误:两行代码未换行导致赋值异常
原代码中MsgBox (fname)Set wb = appXLS.Workbooks.Open(fname, False)、appXLS.Visible = TrueMsgBox (appXLS.Application.Value)属于连续书写的语法错误,会导致变量赋值不符合预期,优先修复该问题。 - 跨Excel实例调用的类型匹配问题:你通过
CreateObject新开了独立的Excel实例运行VLookup,跨实例传递参数时容易出现隐式类型转换异常,你声明的rg为Variant类型,建议明确声明为Excel.Range避免类型歧义。 - 错误处理逻辑混淆:你当前的错误处理把「未找到匹配值」和「类型不匹配」的错误混为一谈,错误13属于类型不匹配,而非无匹配结果,无匹配结果返回的是错误值2042。
修正后的代码
Sub address_change() Dim updatesheet As Variant Dim sbw As String Dim Param As String Dim entier As Integer Dim fname As String Dim tsk As Task ' 明确声明为Excel.Range类型 Dim rg As Excel.Range Dim ws As Sheets Dim wb As Excel.Workbook Dim appXLS As Object Dim entxls As Object Dim i As Integer Set appXLS = CreateObject("Excel.Application") If appXLS Is Nothing Then MsgBox ("XLS not installed") Exit Sub ' 无Excel时直接退出避免后续报错 End If fname = ActiveProject.Path & "\" & Dir(ActiveProject.Path & "\addresses.xlsx") MsgBox (fname) Set wb = appXLS.Workbooks.Open(fname, False) Set rg = appXLS.Worksheets("sheet2").Range("A:U") appXLS.Visible = True On Error Resume Next For Each tsk In ActiveProject.Tasks Param = tsk.Text2 If tsk.OutlineLevel = 2 Then Err.Clear ' 每次查找前清空错误记录 ' 强制转换查找值为字符串,匹配工作表文本格式 updatesheet = appXLS.WorksheetFunction.VLookup(CStr(Param), rg, 16, False) If Err.Number = 13 Then tsk.Text13 = "类型不匹配" ElseIf Err.Number <> 0 Then tsk.Text13 = "No match 32" Else tsk.Text13 = updatesheet End If End If Next tsk ' 释放资源,避免后台残留Excel进程 wb.Close SaveChanges:=False appXLS.Quit Set rg = Nothing Set wb = Nothing Set appXLS = Nothing End Sub
额外注意事项
如果修复后仍报错,可直接用Excel实例的Evaluate方法执行VLookup,稳定性更高,写法参考:updatesheet = appXLS.Evaluate("VLOOKUP(""" & Replace(Param, """", """""") & """,'sheet2'!A:U,16,FALSE)")
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

