Проблема с vlookup и абсолютной ссылкой и последней VBA - PullRequest
0 голосов
/ 02 марта 2019

enter image description here У меня есть макрос, который выполняет vlookup, беря имя поставщика в столбце J и ищет номер поставщика в массиве моей таблицы vlookup в столбцах C и D. Однако, когда язапустить макрос, что-то идет не так с моим vlookup.Пожалуйста, смотрите формулу на картинке.Очевидно, часть моего массива таблиц в моем vlookup не работает должным образом.На самом деле, я хотел бы, чтобы мой vlookup возвращал мне фиксированный массив таблиц (я имею в виду с абсолютной ссылкой и долларом) из исходной точки C5 и в качестве предельной точки последнюю строку в столбце D (я имею в виду, что предел моего массива таблиц должен бытьпоследняя строка столбца D).

Пожалуйста, посмотрите мой код VBA ниже, кажется, что эта часть моего кода VBA внутри моего vlookup неверна: C4 "& LastRow &"

Большое спасибоза помощь.Хави

Sub insertvlookuptogetmyvendornumber()
Dim LastRow As Integer
LastRow = Range("D" & Rows.Count).End(xlUp).Row
PenultimateLastRow = Range("J" & Rows.Count).End(xlUp).Offset(-1, 0).Row 

Range("I4").Select
ActiveCell.FormulaR1C1 = "Vendor number"
Range("I5").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[1],R5C3:C4" & LastRow & ",2,0)"
Selection.AutoFill Destination:=Range("I5:I" & PenultimateLastRow), Type:=xlFillDefault
End Sub

1 Ответ

0 голосов
/ 02 марта 2019

В соответствии с моим комментарием я буду вести историческую таблицу имен и номеров.Сначала я прочитал бы это в словарь, а затем зациклил соответствующие столбцы сводной таблицы, обновляя значение словаря, если имя существует.Если имя не существует, добавьте имя и номер в словарь.В конце напишите все обратно исторической таблице.

Историческая таблица - это ваша текущая таблица, в которой вы пытаетесь выполнить VLookup.В этом случае эта таблица будет содержать только совпадающие пары, к которым добавляются новые значения из сводной таблицы или обновляются существующие значения.

Для повторного выполнения таблицы справа, столбцы I & J должны иметь толькопары в нем совпадают для начала.Жестко закодировано.

Предполагается, что в сводном теле нет строк промежуточных итогов / итогов, хотя они могут быть исключены, если они присутствуют, при обновлении кода.

Option Explicit

Public Sub UpdateReferenceTable()

    Dim lastRow As Long, dict As Object, ws As Worksheet, pvt As PivotTable, i As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set pvt = ws.PivotTables("PivotTable1")

    Set dict = CreateObject("Scripting.Dictionary")

    With ws
        lastRow = .Cells(.Rows.Count, "I").End(xlUp).Row
    End With

    Dim initialDictData(), pivotTableUpdates()
    initialDictData = ws.Range("I9:J" & lastRow).Value

    For i = LBound(initialDictData, 1) To UBound(initialDictData, 1)
        dict(initialDictData(i, 2)) = initialDictData(i, 1)
    Next

    Dim names(), vendorNumbers()
    names = Application.Transpose(pvt.PivotFields("Name 1").DataRange.Value)
    vendorNumbers = Application.Transpose(pvt.PivotFields("Vendor Number").DataRange.Value)

    For i = LBound(names) To UBound(names)
        If names(i) <> vbNullString Then
            If dict.exists(names(i)) Then
                dict(names(i)) = vendorNumbers(i)
            Else
                dict.Add names(i), vendorNumbers(i)
            End If
        End If
    Next
    ws.Range("I9").Resize(dict.Count, 1) = Application.Transpose(dict.items)
    ws.Range("J9").Resize(dict.Count, 1) = Application.Transpose(dict.Keys)
End Sub

Данные:

image

...