Как обрабатывать ошибку 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

  1. Форматы 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