純粋な VBA を使用した別のソリューション:
パフォーマンスに対する強いニーズがあるため、この SO questionで示唆されているように、dict オブジェクトを使用することをお勧めします。ディクショナリを使用する利点は、一度作成すると非常に高速に検索できることです。したがって、私のコードはルックアップで非常に高速であると期待しています。一方、(ループを介して) 個々のセルにアクセスする場合は、組み込みのVLOOKUP
.
30,000 エントリのリファレンス シートと、それぞれ 30,000 行の 3 つのルックアップ シートを使用した比較パフォーマンス:
- 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