1

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

有什么办法可以加快这段代码的速度吗?

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

   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

4 回答 4

5

这比简单循环(在 20k 个值的列上进行测试,其中 3 个与正在搜索的值匹配)快大约 20-30 倍。

'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
于 2013-09-20T23:57:57.353 回答
2

http://www.excelhero.com/blog/2011/03/the-imposing-index.html说“Excel INDEX MATCH比 VLOOKUP 快得多

于 2013-09-20T20:41:12.700 回答
0

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

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

于 2013-09-20T20:40:43.240 回答
0

摘要: 连接这些值并对vlookup新值执行操作。

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

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

然后在我的比较标签中

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

报告选项卡

它采用了 ID 列,与我在 的查找日期连接$F$1,并vlookup'ed 到我的数据选项卡(历史数据)中。 历史数据选项卡

于 2017-10-23T14:23:29.443 回答