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 .
+1 dobrym podejściem. – brettdj
Podziękowania dla Davida Zemensa za dodatkowe wyjaśnienia i sugestie. –
+1 Znacznie lepiej niż zaakceptowany, (który btw potrzebuje 'Err.Clear' gdy' Err.Number <> 0'). – Ioannis