我运行这组代码,它返回一个错误:

运行时错误'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/

10-13 02:14