Come gestire l’errore 1004 Errore con WorksheetFunction.VLookup?

Ho questo codice:

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) 

Non ci si aspetta che VLookup trovi sempre un risultato; ma quando non trova un risultato, la linea si arresta prima che io possa persino controllare la riga successiva.

L’errore:

Errore di run-time ‘1004’: imansible ottenere la proprietà VLookup della class WorksheetFunction

Funziona bene quando viene trovato un risultato. Qual è un buon modo per gestire gli errori qui?

C’è un modo per saltare gli errori all’interno del codice e andare avanti con il ciclo comunque, spero che aiuti:

 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 

Invece di WorksheetFunction.Vlookup , puoi usare Application.Vlookup . Se si imposta una Variant uguale a questa, si restituisce l’errore 2042 se non viene trovata alcuna corrispondenza. È quindi ansible testare la variante – cellNum in questo caso – con 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 

Le versioni Application delle funzioni VLOOKUP e MATCH consentono di verificare gli errori senza generare errori. Se si utilizza la versione di WorksheetFunction , è necessaria una gestione degli errori convoluta che reindirizza il codice a un gestore di errori, restituisce l’istruzione successiva da valutare, ecc. Con le funzioni Application , è ansible evitare tale confusione.

Quanto sopra potrebbe essere ulteriormente semplificato usando la funzione IIF . Questo metodo non è sempre appropriato (ad esempio, se devi fare più / differenti procedure basate sul If/Then ) ma nel caso in cui stai semplicemente cercando di determinare quale prompt visualizzare nella MsgBox, dovrebbe funzionare:

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

Considera quei metodi invece delle istruzioni On Error ... Sono entrambi più facili da leggere e conservare: poche cose sono più confuse di quelle che cercano di seguire una serie di dichiarazioni GoTo e Resume .

Dalla mia esperienza limitata, questo accade per due ragioni principali:

  1. Il valore lookup_val (arg1) non è presente in table_array (arg2)

La soluzione semplice qui è quella di utilizzare un gestore di errori che termina con Resume Next

  1. I formati di arg1 e arg2 non sono interpretati correttamente

Se il tuo lookup_value è una variabile, puoi allegarlo a TRIM()

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