我希望通过VBA宏中的字典进行vlookup。我在互联网上看到了一些例子,但它们大多都是非常具体的,我希望得到更多的帮助,以及#34;裸骨和#34;码。我将使用一个我想要实现的简单示例:
查找值是" Orders"中的单元格B2开始的动态范围内的每个单元格的值。工作表(底行各不相同)
表格数组位于动态范围内,从单元格E2开始并延伸到"报告"工作表(底行各不相同)
列索引编号为8(L列)
范围查找是假的
我目前的代码如下:
Sub DictionaryVLookup()
Dim x, y, z(1 To 10)
Dim i As Long
Dim dict As Object
Dim LastRow As Long
LastRow = Worksheets("Report").Range("B" & Rows.Count).End(xlUp).Row
x = Sheets("Orders").Range("B2:B" & LastRow).Value
y = Sheets("Report").Range("E2:E" & LastRow).Value 'looks up to this range
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(x, 1)
dict.Item(x(i, 1)) = x(i, 1)
Next i
For i = 1 To UBound(y, 1)
If dict.exists(y(i, 1)) Then
z(i) = y(i, 1)
Else
z(i) = "NA"
End If
Next i
Worksheets("Orders").Range("Z2:Z" & LastRow).Value = Application.Transpose(z) 'this is where the values are placed
End Sub
我似乎错过了"查找"部分,目前运行没有错误,简单地放置"找到的值"通过查找,但我不知道如何使返回的值被偏移(在这个例子中想要返回列L)。
我还做了一些"弗兰肯斯坦"使用此代码 - 所以我不确定为什么会这样:
Dim x, y, z(1 To 10)
(1到10)我想要动态,我猜。
这是我第一次尝试以这种方式使用字典 - 希望通过这个简单的例子获得基本的理解,然后我可以在更复杂的情况下实现它。
我知道还有其他方法可以做我正在描述的内容,但希望专门学习字典。
提前感谢您的任何帮助!
答案 0 :(得分:1)
这样的事情:
Sub DictionaryVLookup()
Dim x, x2, y, y2()
Dim i As Long
Dim dict As Object
Dim LastRow As Long, shtOrders As Worksheet, shtReport As Worksheet
Set shtOrders = Worksheets("Orders")
Set shtReport = Worksheets("Report")
Set dict = CreateObject("Scripting.Dictionary")
'get the lookup dictionary from Report
With shtReport
LastRow = .Range("E" & Rows.Count).End(xlUp).Row
x = .Range("E2:E" & LastRow).Value
x2 = .Range("L2:L" & LastRow).Value
For i = 1 To UBound(x, 1)
dict.Item(x(i, 1)) = x2(i, 1)
Next i
End With
'map the values
With shtOrders
LastRow = .Range("B" & Rows.Count).End(xlUp).Row
y = .Range("B2:B" & LastRow).Value 'looks up to this range
ReDim y2(1 To UBound(y, 1), 1 To 1) '<< size the output array
For i = 1 To UBound(y, 1)
If dict.exists(y(i, 1)) Then
y2(i, 1) = dict(y(i, 1))
Else
y2(i, 1) = "NA"
End If
Next i
.Range("Z2:Z" & LastRow).Value = y2 '<< place the output on the sheet
End With
End Sub