2017-02-14 7 views
0

私は、カスタム関数を作成し、後でアドインとしてロードすることにより、INDEX/MATCHルックアップメソッド(これは通常のVLOOKUPメソッドより高速/優れています)のラッパーを作成しようとしています。IfErrorがエラーを返すのはなぜですか?

これまでのところ良くなったが、私の望む動作は、検索する値が見つからない場合、空白( "")で#VALUE!だから私は、Excelシート上で、私は希望これと同じ方法を達成するために、IFERROR WorksheetFunctionを使用しようとしています:

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の範囲に値が見つからない場合

言うまでもなく、IFERROR(FastLookup(H6、E3:E6、F3:F6)、 ")をExcelシートに直接使用すると、動作します。

IfErrorのVBAバージョンを作成する方法に関するアイデアはありますか?

+2

'Application.WorksheetFunction.Match'は、一致するものが見つからない場合に* VBAランタイムエラー*を発生させます。そのタイプのエラーを' IfError'でトラップすることはできませんが、代わりに@scott cranerのように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は機能しませんか? (つまり、内部のMatch関数をIfError関数でラップし、外部のIndex関数を別のIfError関数でラップします)。 – biyectivo

+0

あなたは@TimWilliamsのコメントを見ましたか?ワークシート関数IFERRORはエラーをキャプチャしません。エラーはvbaによってスローされ、エラーを検出して式の次のステップをテストせずに関数を終了するとすぐに残りの式を調べるのをやめます。したがって、エラーが発生した場合は、1つのパーツを分離し、スキップするようにvbaに指示する必要があります。そのエラーをテストします。 –

+0

いいえ、私はそのコメントを見ませんでした。あなたが見た唯一の記事はあなたのものです。あなたの助けとフィードバックに感謝します! – biyectivo

関連する問題