我正在尝试使用我在下面的问题中找到的VBA Vlookup,但我一直得到结果#Value(根据评论,我不是唯一一个)。
问题:How to optimize vlookup for high search count ? (alternatives to VLOOKUP)
将功能放入VBA后。我在我的工作表中使用它就像普通的Vlookup:" =vbalookup(value,Range,Col)
"。
我也试过作为一个数组公式,但它仍然没有工作。
有人明白为什么吗?
Function vbalookup(lookupRange As Range, refRange As Range, dataCol As Long) As Variant
Dim dict As New Scripting.Dictionary
Dim myRow As Range
Dim I As Long, J As Long
Dim vResults() As Variant
' 1. Build a dictionnary
For Each myRow In refRange.Columns(1).Cells
' Append A : B to dictionnary
dict.Add myRow.Value, myRow.Offset(0, dataCol - 1).Value
Next myRow
' 2. Use it over all lookup data
ReDim vResults(1 To lookupRange.Rows.Count, 1 To lookupRange.Columns.Count) As Variant
For I = 1 To lookupRange.Rows.Count
For J = 1 To lookupRange.Columns.Count
If dict.Exists(lookupRange.Cells(I, J).Value) Then
vResults(I, J) = dict(lookupRange.Cells(I, J).Value)
End If
Next J
Next I
vbalookup = vResults
End Function
答案 0 :(得分:0)
我强烈建议首先了解代码正在做什么,而不是盲目地从其他人那里复制代码。如果您必须盲目复制,请先阅读评论:How to optimize vlookup for high search count ? (alternatives to VLOOKUP)
对代码的问题进行了尝试(除了设计,语法,缩进等问题)之外,你的函数没有返回特定的值:
ReDim vResults(1 To lookupRange.Rows.Count, 1 To lookupRange.Columns.Count) As Variant
For I = 1 To lookupRange.Rows.Count
For J = 1 To lookupRange.Columns.Count
If dict.Exists(lookupRange.Cells(I, J).Value) Then
vResults(I, J) = dict(lookupRange.Cells(I, J).Value)
End If
Next J
Next I
vbalookup = vResults
您是否看到它是如何创建二维数组的,并且根据公式返回此数组?尝试在函数结束前添加断点,并查看vResults
窗口中Locals
的内容。
这意味着,为了实际使用该功能,必须作为数组公式输入到单元格中。
要简单地执行此操作,请在将公式输入单元格时按CTRL+SHIFT+ENTER
而不是ENTER
。
这引起了强烈的谨慎:你不仅不知道这段代码是如何工作的,而且你也可能不知道数组公式是如何工作的。 您和您一个人负责您的计算。如果你正在处理任何重要的事情,那么这里就是龙而转向其他方式。
一旦你理解了这一切是如何运作的,你可以更容易地使用代码。