另一种解决方案,使用纯 VBA:
由于对性能有强烈的需求,我建议使用 dict 对象,正如这个 SO question中所暗示的那样。使用字典的优点是一旦建立起来查找起来非常快。所以我希望我的代码在查找中非常快。另一方面,访问单个单元格(通过循环)会比内置的要慢VLOOKUP
。
比较性能,使用包含 30,000 个条目的参考表和 3 个查找表,每个表包含 30,000 行:
- VLOOKUP : 600 秒
- VBA/字典:3秒
因此在这种情况下,使用 VBA 字典的性能提高了 200 倍。
注意:您必须添加对“Microsoft Scripting Runtime”的引用(从 VBA 窗口的工具->引用菜单)
注意:如果参考表中的数据不连续或有重复,此解决方案将不起作用。
Sub FillReferences()
Dim dict As New Scripting.Dictionary
Dim myRow As Range
Dim mySheet As Worksheet
Const RefSheetName As String = "sheet1"
' 1. Build a dictionnary
Set mySheet = Worksheets(RefSheetName)
For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp))
' Append A : B to dictionnary
dict.Add myRow.Value, myRow.Offset(0, 1).Value
Next myRow
' 2. Use it over all sheets
For Each mySheet In Worksheets
If mySheet.Name <> RefSheetName Then
' Check all cells in col A
For Each myRow In mySheet.Range(mySheet.Range("A1").End(xlDown), mySheet.Range("A" & mySheet.Rows.Count).End(xlUp))
' Value exists in ref sheet ?
If dict.exists(myRow.Value) Then
' Put value in col B
myRow.Offset(0, 1).Value = dict(myRow.Value)
End If
Next myRow
End If
Next mySheet
End Sub