16

私はこのコードを持っています:

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)

VLookup は常に結果を見つけるとは限りません。しかし、結果が見つからない場合、次の行でエラーチェックを行う前に行がエラーになります。

エラー:

実行時エラー '1004': WorksheetFunction クラスの VLookup プロパティを取得できません

結果が見つかった場合は正常に動作します。ここでエラーを処理する良い方法は何ですか?

4

3 に答える 3

58

の代わりにWorksheetFunction.Vlookup、 を使用できますApplication.Vlookup。これと等しい値を設定すると、Variant一致するものが見つからない場合にエラー 2042 が返されます。次に、バリアントをテストできますcellNum。この場合は、次のようにし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

および関数のApplicationバージョンを使用すると、エラーを発生さずにエラーをテストできます。バージョンを使用する場合、コードをエラー ハンドラーに再ルーティングする、次のステートメントに戻って評価するなどの複雑なエラー処理が必要になります。関数を使用すると、その混乱を回避できます。VLOOKUPMATCHWorksheetFunctionApplication

上記は、IIF関数を使用してさらに単純化できます。この方法は、常に適切であるとは限りません (たとえば、 に基づいてさらに多くの手順または別の手順を実行する必要If/Thenがある場合)。ただし、MsgBox に表示するプロンプトを単純に決定しようとしている場合は、次のように機能するはずです。

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

ステートメントの代わりに これらのメソッドを検討してください。どちらも読みやすく、保守も簡単です。一連のandステートメントOn Error ...に従うことほど混乱を招くものはほとんどありません。GoToResume

于 2013-08-05T17:30:25.200 に答える
8

コード内のエラーをスキップして、とにかくループを続行する方法があります。それが役立つことを願っています:

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
于 2013-08-05T16:58:13.637 に答える