2013-08-05 522 views
10

我有這樣的代碼:預計不會如何錯誤處理WorksheetFunction.VLookup 1004錯誤?

Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction 
Dim ws As Worksheet: Set ws = Sheets("2012") 
Dim rngLook As Range: Set rngLook = ws.Range("A:M") 

'within a loop 
    currName = "Example" 
    cellNum = wsFunc.VLookup(currName, rngLook, 13, False) 

VLOOKUP總能找到一個結果;但是當它沒有找到結果時,我甚至可能會在下一行發生錯誤時檢查它。

錯誤:

Run-time error '1004': Unable to get the VLookup property of the WorksheetFunction class

時,結果發現它工作正常。這裏處理錯誤的好方法是什麼?

回答

4

有一個辦法跳過裏面的代碼中的錯誤,反正與循環下去,希望它有助於:

Sub new1() 

Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction 
Dim ws As Worksheet: Set ws = Sheets(1) 
Dim rngLook As Range: Set rngLook = ws.Range("A:M") 

currName = "Example" 
On Error Resume Next ''if error, the code will go on anyway 
cellNum = wsFunc.VLookup(currName, rngLook, 13, 0) 

If Err.Number <> 0 Then 
''error appeared 
    MsgBox "currName not found" ''optional, no need to do anything 
End If 

On Error GoTo 0 ''no error, coming back to default conditions 

End Sub 
37

相反的WorksheetFunction.Vlookup,您可以使用Application.Vlookup。如果您設置的Variant等於此值,則返回錯誤2042,如果未找到匹配項。在這種情況下cellNum - - 然後,您可以測試與變異IsError

Sub test() 
Dim ws As Worksheet: Set ws = Sheets("2012") 
Dim rngLook As Range: Set rngLook = ws.Range("A:M") 
Dim currName As String 
Dim cellNum As Variant 

'within a loop 
currName = "Example" 
cellNum = Application.VLookup(currName, rngLook, 13, False) 
If IsError(cellNum) Then 
    MsgBox "no match" 
Else 
    MsgBox cellNum 
End If 
End Sub 

Application版本的VLOOKUPMATCH功能允許您測試是否有錯誤,而不提高錯誤。如果您使用WorksheetFunction版本,則需要進行錯綜複雜的錯誤處理,將您的代碼重新路由到錯誤處理程序,返回到下一個語句以評估等。使用Application函數,可以避免混亂。

使用IIF函數可以進一步簡化上述操作。這種方法並不總是合適的(例如,如果你必須根據If/Then做更多/不同的過程),但在這種情況下,你只是試圖確定在MsgBox中顯示什麼提示,它應該工作:

cellNum = Application.VLookup(currName, rngLook, 13, False) 
MsgBox IIF(IsError(cellNum),"no match", cellNum) 

考慮那些方法而不是On Error ...陳述。它們都比較容易閱讀和維護 - 與試圖跟隨大量的GoToResume陳述相比,有一些東西更容易混淆。

+3

+1不錯的辦法將其包含的變量。 – brettdj

+3

感謝David Zemens對他的補充解釋和建議。 –

+4

+1比接受的好得多(當Err.Number <> 0時,它需要一個'Err.Clear')。 – Ioannis

1

從我有限的經驗,出現這種情況主要有兩個原因:

  1. Lookup_Array中(ARG1)不存在於table_array的(ARG2)

這裏簡單的解決方案將使用以Resume Next結尾的錯誤處理程序

  1. ARG1和ARG2的格式不正確

解釋如果你的lookup_value是你可以用TRIM()

cellNum = wsFunc.VLookup(TRIM(currName), rngLook, 13, False)