WorksheetFunction.Vlookup возвращает ошибку в цикле For-Each - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь закодировать vlookup с помощью WorksheetFunction для выполнения обычного vlookup в Excel (динамическая ячейка, которую нужно искать, и динамические ячейки для ввода результатов).

Sub vlookupFunction()

    Dim cl As Range
    Dim searchManagersRange As Range
    Dim rangeToSearchManagers As Range
    Dim lastRow As Long

    lastRow = ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
    Set rangeToSearchManagers = ThisWorkbook.Sheets(1).Range("A2:A" & lastRow)
    Set searchManagersRange = ThisWorkbook.Sheets(3).UsedRange

    For Each cl In rangeToSearchManagers
        On Error GoTo managerNotFound
        ThisWorkbook.Sheets(1).Range(cl.Offset(0, 16).Address) = WorksheetFunction.VLookup(cl, searchManagersRange, 2, 0)
    Next cl

managerNotFound:
    cl.Offset(0, 16).Value = "#N/A"
    Resume Next

End Sub

Код работает нормально и завершает поиск, но в конце он возвращает переменную объекта not set ... error, поскольку cl в конце означает "Nothing".

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Вы можете избежать Loop

Option Explicit

Sub test()

    With ThisWorkbook.Sheets(1)
        .Range("Q2:Q" & .Cells(.Rows.Count, "A").End(xlUp).Row).Formula = "=IFERROR(VLOOKUP(A2," & ThisWorkbook.Sheets(3).Name & "!" & ThisWorkbook.Sheets(3).UsedRange.Address & ",2,0),"""")"
    End With

End Sub
0 голосов
/ 04 июня 2019

Используйте Application вместо Worksheetfunction, и вы можете "перехватить" ошибку, не "поднимая" ее, и удалить беспорядочные операторы On Error / Resume.

Прочтите, например, это для получения дополнительной информации.

For Each cl In rangeToSearchManagers
    cl.Offset(0, 16).Value = Application.VLookup(cl, searchManagersRange, 2, 0)
Next cl

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...