VBA Vlookup найти значение с помощью VLookup - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать макрос, который проходит по каждой строке на листе с именем «источник».Нужно искать совпадающее значение в именованном диапазоне "OverheadResults".

При тестировании я получаю

Ошибка 1004 "Метод" Range "объекта '_Worksheet' не удалось

когда я пытаюсь использовать vlookup (прокрутите его вниз внутри цикла 'Main')

Private Const SOURCE_SHEETNAME = "source"
Private Const COLUMN_WBS = 2
Private Const COLUMN_COSTELEM = 9
Private Const COLUMN_COST = 12
Private Const COLUMN_HOURS = 15
Private Const OVERHEAD_LOOKUP_RANGE_NAME = "OverheadResults"

Sub ConvertSAPActuals()
    Dim iLastRow As Long
    Dim iDestRow As Long
    Dim wb As Workbook
    Dim wbDest As Workbook
    Dim shtSource As Worksheet
    Dim shtDest As Worksheet
    Dim sCostElem As String
    Dim result As Variant


    '--make sure source sheet exists
    If Not SheetExists(SOURCE_SHEETNAME) Then
        MsgBox "Missing source sheet", vbCritical
        Exit Sub
    End If

    Set wb = ThisWorkbook
    Set shtSource = wb.Sheets(SOURCE_SHEETNAME)

    '--create destination workbook and sheet
    Set wbDest = Workbooks.Add
    Set shtDest = wbDest.Sheets(1)

   '--Find the last row (in column A) with data.
    iLastRow = shtSource.Range("A:A").Find("*", searchdirection:=xlPrevious).Row

    '--Main Loop
    iDestRow = 1
    For iSourceSheetRow = 2 To iLastRow
        sCostElem = shtSource.Cells(iSourceSheetRow, COLUMN_COSTELEM)
        result = Application.WorksheetFunction.VLookup(sCostElem, shtSource.Range(OVERHEAD_LOOKUP_RANGE_NAME), 2, False)

        '--Check return value of Vlookup
        If IsError(result) Then
        Else
        End If

    Next

End Sub

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Хотя это кажется нелогичным, вы не можете поймать ошибку рабочего листа (например, # N / A, #REF !, и т. Д.), Выданную Application.WorksheetFunction.VLookup или WorksheetFunction.VLookup, в вариант для проверки с помощью IsError.

Вам нужно использовать Application.VLookup.

    Dim result As Variant

    '...

    result = Application.VLookup(sCostElem, shtSource.Range(OVERHEAD_LOOKUP_RANGE_NAME), 2, False)

    '--Check return value of Vlookup
    If IsError(result) Then
        debug.print "error: " & result
    Else
        debug.print "match: " & result
    End If
0 голосов
/ 20 марта 2019

Незначительная обработка ошибок

Если вы не хотите менять свой код, вы можете использовать это:

    On Error Resume Next
    result = Application.WorksheetFunction.VLookup(sCostElem, _
            shtSource.Range(OVERHEAD_LOOKUP_RANGE_NAME), 2, False)
    '--Check return value of Vlookup
    If Err Then
        ' Reset error.
        On Error GoTo 0
      Else
'***********************************************************
    ' IMPORTANT CORRECTION:
    ' Added the following line for reasons Pᴇʜ pointed out in the comments.
        ' Reset error.
        On Error GoTo 0
'***********************************************************
        ' Do stuff with 'result' e.g.
        Debug.Print result
    End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...