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 

这比简单的循环快20-30倍(在一列20k的值上进行testing,与search的值相匹配)。

 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 

在继续之前,您可以尝试执行Range.Find以查看查找列中是否存在该值。 您正在循环查找列中的每个项目,只是发现它不在那里。 如果是我,我会做一个Range.find查看查找值是否在lookup_column。 如果是,那么你可以做一个countif,看看有多less事件…如果只有一个事件,使用普通的老式VLookup …并且只有在有多于一个事件的情况下才能返回到你的过程中。 ..可以工作….当然,如果找不到,退出function。

另一个select是将lookup_column加载到任何数组中…并处理该数组,而不是range.mnthat有时可以帮助。

总结:将这些值连接起来,然后对这个新值进行vlookup

对我来说,我需要有一个公式,而不是一个函数来查找2个值。 VLOOKUP只能从我看到的单个值中工作,所以我的解决scheme是连接单个主键的2个值。

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

然后在我的比较标签中

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

报告标签

将ID列与我的$F$1查找date连接起来,然后将vlookupjoin到我的数据选项卡(历史数据)中。 历史数据选项卡