vlookup和绝对引用以及lastrow VBA的问题

时间:2019-03-02 17:37:07

标签: arrays excel vba vlookup

enter image description here我有一个宏,该宏通过在J列中获取供应商名称来执行vlookup,并在我的vlookup的表数组中的C和D列中查找供应商编号。但是,当我运行该宏时,我的vlookup明显出现问题。请参阅所附图片中的公式。显然,我的vlookup中的表数组部分无法正常工作。实际上,我希望我的vlookup从原点C5返回一个固定的表数组(我的意思是带有绝对引用和美元),并且作为限制点,D列的最后一行(我的意思是我的表数组的限制应该是D列的最后一行)。

请在下面查看我的VBA代码,看来我的vlookup中的我的VBA代码的这一部分是错误的 :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 :(得分:1)

根据我的评论,我将保留一个具有历史意义的名称和数字表。我最初将其读入字典,然后循环旋转数据透视表的相应列,如果该名称存在,则更新字典值。如果名称不存在,则将名称和数字添加到字典中。最后,将所有内容写出历史表格。

历史表是您正在尝试执行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

数据: