2013-08-05 19 views
10

mam ten kod:Jak błąd obsługi 1004 Błąd z WorksheetFunction.VLookup?

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) 

WYSZUKAJ.PIONOWO nie oczekuje się zawsze znaleźć rezultat; ale gdy nie znajdzie wyniku, błędy linii, zanim będę mógł nawet sprawdzić, to kolejna linia.

Błąd:

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

To działa dobrze, gdy wynik został znaleziony. Jaki jest dobry sposób na obsługę błędów tutaj?

Odpowiedz

4

Jest sposób aby pominąć błędy w kodzie i iść z pętli w każdym razie, mam nadzieję, że pomaga:

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

Zamiast WorksheetFunction.Vlookup, można użyć Application.Vlookup. Jeśli ustawisz wartość równą, zwróci błąd 2042, jeśli nie zostanie znaleziony żaden dopasowany element. Następnie można przetestować wariant - cellNum w tym przypadku - z 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 

W Application wersje funkcji VLOOKUP i MATCH pozwalają przetestować pod kątem błędów bez podnoszenie błędu. Jeśli używasz wersji WorksheetFunction, potrzebujesz zawiłej obsługi błędów, która przekierowuje twój kod do programu obsługi błędów, powraca do następnej instrukcji w celu oceny itp. Dzięki funkcjom Application można uniknąć tego bałaganu.

Powyższe można jeszcze bardziej uprościć, używając funkcji IIF. Ta metoda nie zawsze jest odpowiednia (np. Jeśli musisz wykonać więcej/inną procedurę w oparciu o If/Then), ale w przypadku, gdy po prostu próbujesz ustalić, co jest wyświetlane w MsgBox, powinno działać:

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

Rozważ te metody zamiast oświadczeńOn Error .... Obydwa są łatwiejsze do odczytania i utrzymywania - kilka rzeczy jest bardziej mylących niż próbowanie podążać za stwierdzeniami GoTo i .

+3

+1 dobrym podejściem. – brettdj

+3

Podziękowania dla Davida Zemensa za dodatkowe wyjaśnienia i sugestie. –

+4

+1 Znacznie lepiej niż zaakceptowany, (który btw potrzebuje 'Err.Clear' gdy' Err.Number <> 0'). – Ioannis

1

Z mojego ograniczonego doświadczenia, to dzieje się z dwóch głównych powodów:

  1. szukana_wartość (arg1) nie jest obecny w table_array (arg2)

proste rozwiązanie tutaj to użycie procedury obsługi błędów zakończonej: Resume Next

  1. Formaty arg1 i arg2 nie są interpretowane prawidłowo

Jeśli Twój lookup_value jest zmienną można ująć ją TRIM()

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

Powiązane problemy