我正在使用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
答案 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)