我运行这组代码,它返回一个错误:
运行时错误'1004'无法获取WorksheetFunction类的Vlookup属性。
我已经在另一个子例程中有一个vlookup。
这段代码有什么问题吗?我进行调试,并且错误出现在该策略框中。
Sub LinkPolicyNum()
Dim r As Integer
Dim policynum As Variant
Dim lookup_num As Range
Dim policybox As Variant
r = ActiveCell.Row
'Row number of the Selected Cell
policynum = ActiveSheet.Cells(r, 3).Value
Set lookup_num = ThisWorkbook.Sheets("PolicyDetails").Range("a1:z5000")
policybox = Application.WorksheetFunction.VLookup(policynum, lookup_num, 3, False)
'to match the policy number to the policy details
MsgBox policynum
MsgBox policybox
End Sub
最佳答案
您的代码似乎没有错。您会看到使用WorksheetFunction
版本的函数时将发生的结果,并且不返回任何结果。具体来说,它们引发错误并中断VBA的执行。在这种情况下,如果您在工作簿中而不是在VBA中尝试相同的公式,则会出现某种形式的错误(可能是#N/A
或#VALUE!
)。
如果要防止这种情况发生,最简单的方法是更改为使用Application.VLookup
而不是Application.WorksheetFunction.VLookup
。尽管没有Intellisense可以帮助实现此功能,但除了错误处理外,它的行为与其他行为相同。如果函数的非WorksheetFunction
版本有错误,它将返回错误而不是抛出错误。这使您可以检查错误,然后继续执行代码。
如果您认为应该在此处使用VLOOKUP
查找值,则可以开始检查文本/数字和类似内容之间的不匹配情况。我会使用公式而不是在VBA中进行检查。
这是使用其他功能形式并捕获错误的示例。
Sub LinkPolicyNum()
Dim r As Integer
Dim policynum As Variant
Dim lookup_num As Range
Dim policybox As Variant
r = ActiveCell.Row
'Row number of the Selected Cell
policynum = ActiveSheet.Cells(r, 3).Value
Set lookup_num = ThisWorkbook.Sheets("PolicyDetails").Range("a1:z5000")
policybox = Application.VLookup(policynum, lookup_num, 3, False)
'to match the policy number to the policy details
If IsError(policybox) Then
'possibly do something with the "not found" case
Else
MsgBox policynum
MsgBox policybox
End If
End Sub
有关此问题的参考:http://dailydoseofexcel.com/archives/2004/09/24/the-worksheetfunction-method/
关于vba - 无法使vlookup正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29939770/