避免"#值"使用带有Scrypting Dictionary的Vlookup时出错

时间:2018-01-11 14:10:45

标签: excel vba excel-vba dictionary vlookup

我正在尝试使用我在下面的问题中找到的VBA Vlookup,但我一直得到结果#Value(根据评论,我不是唯一一个)。
问题:How to optimize vlookup for high search count ? (alternatives to VLOOKUP)

enter image description here

将功能放入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

1 个答案:

答案 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

这引起了强烈的谨慎:你不仅不知道这段代码是如何工作的,而且你也可能不知道数组公式是如何工作的。 您和您一个人负责您的计算。如果你正在处理任何重要的事情,那么这里就是龙而转向其他方式。

一旦你理解了这一切是如何运作的,你可以更容易地使用代码。