Как обрабатывать ошибку 1004 с помощью WorksheetFunction.VLookup?
У меня есть этот код:
Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
'within a loop
currName = "Example"
cellNum = wsFunc.VLookup(currName, rngLook, 13, False)
Ожидается, что VLookup всегда найдет результат; но когда он не найдет результата, ошибки в строке до того, как я смогу даже проверить ошибку, следующая строка.
Ошибка:
Ошибка времени выполнения "1004": невозможно получить свойство VLookup класса WorksheetFunction
Он отлично работает, когда результат найден. Какой хороший способ обработки ошибок здесь?
Ответы
Ответ 1
Есть способ пропустить ошибки внутри кода и продолжать цикл в любом случае, надеюсь, что это поможет:
Sub new1()
Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets(1)
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
currName = "Example"
On Error Resume Next ''if error, the code will go on anyway
cellNum = wsFunc.VLookup(currName, rngLook, 13, 0)
If Err.Number <> 0 Then
''error appeared
MsgBox "currName not found" ''optional, no need to do anything
End If
On Error GoTo 0 ''no error, coming back to default conditions
End Sub
Ответ 2
Вместо WorksheetFunction.Vlookup
вы можете использовать Application.Vlookup
. Если вы установите для него значение Variant
, оно возвращает ошибку 2042, если совпадение не найдено. Затем вы можете проверить вариант - cellNum
в этом случае - с помощью IsError
:
Sub test()
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
Dim currName As String
Dim cellNum As Variant
'within a loop
currName = "Example"
cellNum = Application.VLookup(currName, rngLook, 13, False)
If IsError(cellNum) Then
MsgBox "no match"
Else
MsgBox cellNum
End If
End Sub
Версии Application
функций VLOOKUP
и MATCH
позволяют тестировать ошибки без повышения ошибки. Если вы используете версию WorksheetFunction
, вам нужна свернутая обработка ошибок, которая перенаправляет ваш код обработчику ошибок, возвращается к следующему оператору для оценки и т.д. С помощью функций Application
вы можете избежать этого беспорядка.
Вышеупомянутое может быть дополнительно упрощено с помощью функции IIF
. Этот метод не всегда подходит (например, если вам нужно выполнять больше/разные процедуры на основе If/Then
), но в случае этого, когда вы просто пытаетесь определить, какую подсказку отображать в MsgBox, он должен работать:
cellNum = Application.VLookup(currName, rngLook, 13, False)
MsgBox IIF(IsError(cellNum),"no match", cellNum)
Рассмотрим те методы вместо On Error ...
. Их легче читать и поддерживать - несколько вещей более сбивают с толку, чем пытаться выполнить кучу инструкций GoTo
и Resume
.
Ответ 3
Из моего ограниченного опыта это происходит по двум основным причинам:
- Значение lookup_value (arg1) отсутствует в table_array (arg2)
Простым решением здесь является использование обработчика ошибок с Resume Next
- Форматы arg1 и arg2 не интерпретируются правильно
Если ваша lookup_value
- переменная, вы можете заключить ее с помощью TRIM()
cellNum = wsFunc.VLookup( TRIM (currName), rngLook, 13, False)
Ответ 4
Фантастика! Большое спасибо. Я изо всех сил пытался найти решение, но приведенный ниже код решил мою проблему за минуту. cellNum = Application.VLookup(currName, rngLook, 13, False) Если IsError (cellNum), то MsgBox "нет совпадения", иначе MsgBox cellNum End If