2012-11-09 84 views
0

我试图使用Vlookup在“数据库”(DB_SHEET)中查找一些税。当我的名字不存在于我的数据库中时,我在VlookUp中收到错误'1004'。Catch 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”和catch错误使用“上的错误”。

的作品

其他版本:

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”。

+0

我不认为你可以在这样的循环中使用错误处理程序。尝试在循环之外移动它,然后在增加行号之后添加Resume Next。 –

+0

是的,我可以。而且我不想使用“继续下一步”,在此代码中,我更愿意使用“On erro goto Label:” – Makah

+0

继续下一步会出现在您的错误标签之后。我并不是建议你使用“On Error Resume Next” –

回答

2

这是因为Excel错误和VB错误之间的区别。你的VLookup会抛出一个Excel错误,但VB代码工作正常(该变体现在只包含错误代码)。如果你想在你的VBA中做1/0,你会得到一个VB错误,它将被捕获到On Error GoTo ...

你已经找到了解决方案来捕获Excel错误,通过检查表达式的值是否是错误IsError()函数,所以我无法填补你的空间!

现在假设tax1tax2是十进制数,通常你可以改变Dim这些2个变量来反映这一点,在为Variant代替标注尺寸为Single。现在你会得到一个VB错误,当你的VLookup失败,因为错误不能放在Single和那个失败你可以捕获一个On Error GoTo ...

+0

感谢您的快速回复。但如果我从“代码2”我的税1和税2改为单我有同样的错误。即使我将WorksheetFunction更改为应用程序功能,我得到'错误13'而不是'错误1004'。 – Makah

+0

这里我要说明的主要观点是,如果找不到搜索值(假设最后一个参数为FALSE),Application.Worksheetfunction.VLookup()会抛出一个错误(必须使用错误处理程序捕获它) 。 'Application.VLookup()'不会抛出一个错误,而是会返回一个错误,正如你注意到的那样,你可以用'IsError()'来测试。 –

+0

我明白你所说的关于Vlookup(),但我的问题不是这样。我很惊讶,Vlookup()返回期望的值(string,int,double ...)或一个错误。所以,即使我知道返回一个double,我不能将它定义为double,因为该函数可能会返回一个错误。 – Makah