0

我正在尝试使用 Vlookup 在“数据库”(DB_SHEET)中查找一些税款。当我的数据库中不存在我的名字时,我在 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" 并使用 "On Error" 捕获错误。

其他有效的版本:

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通常是十进制数,您可以更改这Dim 两个变量SingleVariant现在,当您的 VLookup 失败时,您将收到一个 VB 错误,因为无法将错误放入其中,Single并且您可以使用 THAT FAIL 捕获On Error GoTo ...

于 2012-11-09T12:35:23.717 回答