-
你好
我的vlookup上一直有一个错误13,当我在我的工作表上执行vlookup时,它很快就会工作,vba不是吗?我正在寻求帮助
这是我的代码,所有列都是我的工作表中的文本
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
Dim rg As Variant
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")
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 = TrueMsgBox (appXLS.Application.Value)
On Error Resume Next
For Each tsk In ActiveProject.Tasks
Param = tsk.Text2
If tsk.OutlineLevel = 2 Then
updatesheet = appXLS.Application.VLookup(Param, rg, 16, False)
If Err.Number <> 0 Then
tsk.Text13 = "No match 32"
Else
tsk.Text13 = updatesheet
End If
End If
Next tsk
End Sub
有两种方法可以将ExcelVLookup
(以及类似的函数,如Match
)与VBA一起使用,但它们有所不同。
如果找不到搜索词,Application.VLookup
(您正在使用的版本)将返回错误值Error 2042
。这不是运行时错误,而是返回值。错误值是VBA中的一种特殊数据类型(它们不是字符串,Error 2042
只是它的表示形式)。确切地说,如果Vlookup失败,这个错误就是您在Excel中看到的#N/A
。
将结果写入变量updatesheet
中,这很好,因为它被声明为Variant
,并且变量可以包含错误值。但是,现在您检查是否发生了错误,因为事实并非如此,它将尝试将错误值分配给tsk.Text13
,这会导致类型不匹配错误(我假设tsk.Text13
需要一个字符串)。
您需要检查updatesheet
是否包含错误值,而不是像您那样检查运行时错误,这是使用IsError
-函数完成的。在这种情况下,您还可以使用Application.IsNA()
-函数。
另一种选择是使用WorksheetFunction.Vlookup
,如果找不到搜索项,这将引发运行时错误,您需要将其封装到错误处理中。
使用一种或另一种方法:
updatesheet = appXLS.VLookup(Param, rg, 16, False)
If appXLS.IsNA(updatesheet) Then
tsk.text13 = "No match 32"
Else
tsk.text13 = updatesheet
End If
updatesheet = "No match 32"
On Error Resume Next
updatesheet = appXLS.WorksheetFunction.VLookup(Param, rg, 16, False)
On Error GoTo 0
tsk.text13 = updatesheet
为了进一步阅读,我建议https://rubberduckvba.wordpress.com/2021/02/15/worksheetfunction-and-errors/