2017-02-14 5 views
0

Ich versuche, einen Wrapper für die INDEX/MATCH-Lookup-Methode zu erstellen (die schneller/besser als die normale SVERWEIS-Methode ist), indem Sie eine benutzerdefinierte Funktion erstellen und sie anschließend als Add-In laden.Warum gibt IfError einen Fehler zurück?

So weit so gut, aber mein gewünschtes Verhalten ist, dass, wenn der zu suchende Wert nicht gefunden wird, sollte es leer ("") und nicht #VALUE !. So versuche ich, die IfError Work zu verwenden, um diese auf die gleiche Weise zu erreichen, ich auf einem Excel-Sheet würde:

Function FastLookup(parLookupKey As Variant, parLookupRange As Range, parReturnRange As Range) As Variant 

    FastLookup = Application.WorksheetFunction.IfError(Application.WorksheetFunction.Index(parReturnRange, Application.WorksheetFunction.Match(parLookupKey, parLookupRange, 0)), "") 

End Function 

Auch dies noch gibt #VALUE! Wenn im parLookupRange-Bereich kein Wert gefunden wird.

Unnötig zu sagen, wenn ich = IFERROR (FastLookup (H6, E3: E6, F3: F6), "") direkt auf der Excel-Tabelle verwenden, funktioniert es.

Irgendwelche Ideen, wie man die VBA-Version von IfError funktioniert?

+2

'Application.WorksheetFunction.Match' verursacht einen * VBA-Laufzeitfehler *, wenn keine Übereinstimmung gefunden wird - Sie können diesen Fehlertyp nicht mit' IfError' abfangen, sondern müssen die VBA-Fehlerbehandlung verwenden, wie in @scott craner's gezeigt Antworten. –

Antwort

3

Da der Fehler nie über die MATCH-Funktion in Vba. Sobald das einen Fehler auslöst, wird der Code gestoppt.

Verwenden Sie stattdessen:

Function FastLookup(parLookupKey As Variant, parLookupRange As Range, parReturnRange As Range) As Variant 

    Dim t As Long 
    On Error Resume Next 
    t = Application.WorksheetFunction.Match(parLookupKey, parLookupRange, 0) 
    On Error GoTo 0 
    If t > 0 Then 
     FastLookup = parReturnRange(t) 
    Else 
     FastLookup = "" 
    End If 

End Function 

Wir haben jetzt den Fehler erfassen und sie ignorieren. Dann testen wir es und geben den richtigen Wert zurück.

+0

Das funktioniert großartig und ich verstehe, warum es vorher gescheitert ist. Vielen Dank. Aber warum funktioniert der verschachtelte IfError nicht? (d. h. die innere Match-Funktion in eine IfError-Funktion umbrechen, dann die äußere Index-Funktion mit einer anderen IfError-Funktion umhüllen)? – biyectivo

+0

Haben Sie @TimWilliams kommentiert? Die Arbeitsblattfunktion IFERROR wird den Fehler nicht erfassen. Der Fehler wird von vba ausgelöst, und er stoppt den Rest der Formel, sobald er den Fehler findet und die Funktion beendet, ohne den nächsten Schritt in der Formel zu testen. Also müssen wir den einen Teil isolieren und vba sagen, es zu überspringen, wenn es einen Fehler wirft. dann auf diesen Fehler testen. –

+0

Nein, ich habe diesen Kommentar nicht gesehen, der einzige Beitrag, den ich gesehen habe, ist dein. Vielen Dank für Ihre Hilfe und Ihr Feedback! – biyectivo

Verwandte Themen