2012-11-09 83 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