0

Vlookupを使用して、「データベース」(DB_SHEET)で税金を見つけようとしています。私の名前が私のDBに存在しない場合、VlookUpでエラー「1004」が発生しました。

'On Error GoTo Err1'がエラーをキャッチしないのはなぜですか?

私のコード:

Dim tax1 as Double, tax2 as Double, name as String

On Error GoTo Err1
While Cells(rowIndex, 1) <> ""
    name = Cells(rowIndex, 4)
    fin = Cells(rowIndex, 5) * Cells(rowIndex, 6)
    tax1 = WorksheetFunction.VLookup(name, Sheets(DB_SHEET).Range("D:G"), 3, False)
    tax2 = WorksheetFunction.VLookup(name, Sheets(DB_SHEET).Range("K:P"), 2, False)

    Cells(rowIndex, 8) = (fin * tax1) - (fin * tax2)
Err1:
    rowIndex = rowIndex + 1
Wend
On Error Goto 0

動作するコードはすでに知っていますが、「WorksheetFunction」を実行できず、「OnError」を使用してエラーをキャッチできない理由を理解したいと思います。

動作する他のバージョン:

Dim tax1 as Variant, tax2 as Variant, name as String

While Cells(rowIndex, 1) <> ""
    name = Cells(rowIndex, 4)
    fin = Cells(rowIndex, 5) * Cells(rowIndex, 6)
    tax1 = WorksheetFunction.VLookup(name, Sheets(DB_SHEET).Range("D:G"), 3, False)
    tax2 = WorksheetFunction.VLookup(name, Sheets(DB_SHEET).Range("K:P"), 2, False)

    If Not IsError(tax1) And not IsError(tax2) Then
         Cells(rowIndex, 8) = (fin * tax1) - (fin * tax2)
    End if

    rowIndex = rowIndex + 1
Wend

編集(後:K_B回答)

1)WorksheetFunction.Vlookup(...)の内部でApplication.Vlookup(...)を使用すると、「エラー13」が発生します。

4

1 に答える 1

2

これは、ExcelエラーとVBエラーの違いによるものです。VLookupはExcelエラーをキャストしますが、VBコードは正常に機能します(バリアントにはエラーコードが含まれるだけです)。VBAで1/0を実行すると、VBエラーが発生します。On Error GoTo ...

式の値が関数のエラーであるかどうかを確認することで、Excelエラーをキャプチャするための解決策を自分で見つけたIsError()ので、そこに入力することはできません。

ここで、tax1tax2が通常10進数であるとするとDim 、これら2つの変数のを変更してこれを反映しSingle、の代わりにのように次元を設定できますVariant。これで、VLookupが失敗すると、VBエラーが発生します。これは、エラーを入力できず、その失敗をSingleキャプチャできるためです。On Error GoTo ...

于 2012-11-09T12:35:23.717 に答える