2017-02-14 107 views
0

我試圖通過創建一個自定義函數並將其作爲加載項加載後,爲INDEX/MATCH查找方法(比常規VLOOKUP方法更快/更好)創建一個包裝。爲什麼IfError返回錯誤?

到目前爲止這麼好,但我期望的行爲是,當沒有找到要查找的值時,它應該返回空白(「」)而不是#VALUE !.所以我試圖用IFERROR WorksheetFunction,以實現在Excel表單這種以同樣的方式我想:

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 

同樣,這仍然返回#VALUE!如果在parLookupRange範圍內找不到值。不用說,如果我直接在Excel工作表上使用= IFERROR(FastLookup(H6,E3:E6,F3:F6),「」),它就可以工作。

關於如何使VBA版本的IfError工作的任何想法?

+2

'Application.WorksheetFunction.Match'會導致* VBA運行時錯誤*如果找不到匹配項 - 您無法使用IfError捕獲該類型的錯誤,而是需要使用@scott craner's中顯示的VBA錯誤處理回答。 –

回答

3

因爲錯誤永遠不會超過vba中的MATCH函數。只要引發錯誤,代碼就會停止。

使用這個代替:

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 

現在我們捕捉到錯誤並忽略它。然後我們測試它並返回正確的值。

+0

這很好,我明白爲什麼它失敗之前。謝謝。但爲什麼不嵌套IfError的工作? (即,將內部匹配函數包裝在IfError函數中,然後用另一個IfError函數包裝外部索引函數)? – biyectivo

+0

您是否看到@TimWilliams發表評論。工作表函數IFERROR不會捕獲錯誤。錯誤是由vba引發的,一旦發現錯誤並停止查看公式的其餘部分,並退出該函數而不測試公式中的下一步。所以我們需要隔離一個部分,並告訴vba如果拋出錯誤就跳過它。然後測試那個錯誤。 –

+0

不,我沒有看到那個評論,我看到/看到的唯一的帖子是你的。非常感謝您的幫助和反饋! – biyectivo

相關問題