2012-11-09 3 views
0

"데이터베이스"(DB_SHEET)에서 일부 세금을 찾으려면 Vlookup을 사용하려고합니다. 내 이름이 내 DB에 존재하지 않으면 VlookUp에서 '1004'오류가 발생합니다.캐치 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"를 캐치 오류 사용을 할 수없는 이유를 이해하고자합니다. 작동

다른 버전 :

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를 사용하는 경우 (...) INSEAD (.. .) 나는 "Error 13"을 얻었다.

+0

그런 루프에서 오류 처리기를 사용할 수 있다고 생각지 않습니다. 루프 외부로 이동 한 다음 행 번호를 증가시킨 후 다시 시작을 추가하십시오. –

+0

예. 할 수 있습니다. 그리고 "Resume Next"를 사용하고 싶지 않습니다.이 코드에서 "On erro goto Label :"을 사용하는 것을 선호합니다. – Makah

+0

Resume Next는 오류 라벨 다음에 나옵니다. "On Error Resume Next"사용을 제안하지 않았습니다. –

답변

2

Excel 오류와 VB 오류의 차이 때문입니다. VLookup은 Excel 오류를 발생 시키지만 VB 코드는 올바르게 작동합니다 (변형은 이제 오류 코드 만 포함합니다). VBA에서 1/0을 수행하면 VB 오류가 발생하여 On Error GoTo ...

이 표시됩니다. 이미 Excel에서 오류가 발생했는지 확인하여 해결 방법을 찾았습니까? IsError() 기능, 그래서 거기에 당신을 채울 수 없어!

지금 일반적으로 당신이 반영 Variant 등 대신에 Single로 치수를이 두 변수의 Dim을 바꿀 수 tax1tax2 소수점 숫자가 있다고 가정하면. 지금 당신은 VLookup 오류가 에 넣을 수 없기 때문에 VB에서 오류가 발생합니다. On Error GoTo ...

+0

빠른 답장을 보내 주셔서 감사합니다. 하지만 "코드 2"에서 내 tax1과 tax2를 Single로 변경하면 같은 오류가 발생합니다. 그리고 WorksheetFunction을 Application 함수로 변경하더라도 'Error 1004'대신 'Error 13'이 표시됩니다. – Makah

+0

여기서 주목할 점은 검색 값을 찾을 수 없다면 (마지막 인수가 FALSE라고 가정 할 때)'Application.Worksheetfunction.VLookup()'이 오류 처리기를 사용하여 catch해야하는 오류를 던질 것이라는 점입니다. . 'Application.VLookup()'은 에러를 _throw_하지 않지만, 대신에 IsError()로 테스트 할 수있는 에러를 _return_합니다. –

+0

나는 당신이 Vlookup()에 관해 들었던 것을 이해하지만 나의 질문은 그 것이 아닙니다. Vlookup()이 예상 값 (문자열, int, double ...) 또는 Error를 반환한다는 것에 놀랐습니다. 그래서, 비록 함수가 오류를 반환 할 수 있기 때문에 이중 반환 나는 이중으로 정의 할 수 없습니다. – Makah