【问题标题】:Issue with vlookup and absolute reference and lastrow VBAvlookup 和绝对引用以及 lastrow VBA 的问题
【发布时间】:2019-03-02 17:37:06
【问题描述】:

我有一个宏,它通过在列 J 中获取供应商名称来执行 vlookup,并在列 C 和 D 中的我的 vlookup 的表数组中查找供应商编号。但是,当我运行宏时,发生了一些事情我的 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

【问题讨论】:

  • 供应商名称列表是否有限?如果是这样,为什么要使用 VBA?如果您无法维护查找表并只需将历史表存储到字典中,然后循环数据透视表的这两列,如果键不存在,则将项目添加到字典中。然后将字典写回历史表区域。
  • 非常感谢QHarr的回复,其实在我附上的图片上,我只是截取了一小部分供应商名称和供应商编号,实际上列表要长得多...此外,我尝试在 VBA 中将其自动化,因为这是我必须定期做的工作,不幸的是,由于我的错误查找,我的宏无法工作...

标签: arrays excel vba vlookup


【解决方案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

数据:

【讨论】:

  • 非常感谢 QHarr,我试过你的方法,效果很好... FormulaR1C1 = "=VLOOKUP(RC[1],R5C3:C4" & LastRow & ",2,0)" ,我用这个公式代替,它也可以正常工作: ActiveCell.Formula = _ "=IFERROR(VLOOKUP(J5, $C$5:$D" & lastRow & ",2,0),"""")"
  • 干得好。发布问题通常可以帮助您自己找到答案:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多