VLookup多列

时间:2013-09-20 20:27:22

标签: excel vba excel-vba vlookup

我正在使用VLookup函数来查找列中存在的多个值。这非常有效,但只需要花费很多时间,因为我在Excel工作表中有100,000行。

有没有办法加快这段代码?

代码基本上在列中查找特定值并获取偏移量。简单的VLookup与此之间的区别在于,如果有多个行具有相同的查找值,那么它将获取所有元素。

   Function VLookupAll(ByVal lookup_value As String, _
                ByVal lookup_column As Range, _
                ByVal return_value_column As Long, _
                Optional seperator As String = ", ") As String

 Dim i As Long
 Dim result As String

For i = 1 To lookup_column.Rows.Count
If Len(lookup_column(i, 1).Text) <> 0 Then
    If lookup_column(i, 1).Text = lookup_value Then
        result = result & (lookup_column(i).Offset(0, return_value_column).Text & seperator)
    End If
End If
Next

If Len(result) <> 0 Then
result = Left(result, Len(result) - Len(seperator))
End If

VLookupAll = result

End Function

4 个答案:

答案 0 :(得分:5)

这比一个简单的循环快20-30倍(在20k值的列上测试,与搜索的值匹配3次)。

'rng: a single-column range to search for matches
'val: the value to match on
'col: offset from match in rng to concatenate values from (similar
'       to the matching VLOOKUP argument)
Function MultiLookup(rng As Range, val As String, col As Long)

    Dim i As Long, v, s
    Dim r As Long

    r = rng.Cells.Count
    v = Application.Match(val, rng, 0)
    s = ""
    Do While Not IsError(v)
        s = s & IIf(s <> "", ",", "") & rng.Cells(v).Offset(0, col - 1).Value
        r = r - v
        Set rng = rng.Offset(v, 0).Resize(r, 1)
        v = Application.Match(val, rng, 0)
    Loop
    MultiLookup = s

End Function

答案 1 :(得分:2)

http://www.excelhero.com/blog/2011/03/the-imposing-index.html说“Excel INDEX MATCH 明显快于VLOOKUP

答案 2 :(得分:0)

您可以尝试执行Range.Find,以便在继续之前查看查找列中是否存在该值。您正在遍历查阅列中的每个项目,但发现它不存在。如果是我,我会做一个Range.find来查看lookup_column中是否有查找值。如果是,那么你可以做一个countif来查看有多少次出现......如果只有一次出现,使用普通的老式VLookup ......如果有多次出现,只会回到你的过程中...... ..可能工作....当然如果查找失败,请退出该功能。

另一种选择是将lookup_column加载到任何数组中......并处理数组而不是range.mnt,这有时会有所帮助。

答案 3 :(得分:0)

<强>要点: 对值进行连接并对该新值执行vlookup

对我来说,我需要一个公式,而不是一个用2个值查找的函数。 VLOOKUP只能使用我所看到的单个值,因此我的解决方案是连接单个主键的2个值。

在我的原始数据选项卡中,我添加了一个名为Lookup的列,它简单地将ID列与我拥有的Timestamp列连接在一起。

然后在我的比较标签中我有

=VLOOKUP(CONCATENATE(A4, $F$1),'Historical Data'!$A:$G,3,FALSE)

Reporting Tab

其中ID列与我在$F$1的查询日期连接,vlookup加入我的数据标签(历史数据)。 Historical Data tab