以前にも高速化ネタで回答した者ですが、
http://okwave.jp/qa/q9079324.html
で紹介した連想配列が、ここでも速いと考えます。(完全一致の場合に限られますが)
上記の例と同様12万行のデータから、1000個を表引きします。
連想配列だと、840msec程度、Vlookupだと、4倍くらいかかり、3300msec位でした。
簡単な例を提示させていただきますが、その前に上記リンク先の回答に誤り・不十分な点がありましたので、この質問の場をお借りして、別回答で補足させていただきたいと存じます。
' 843msec
Sub vlookup_vs_dic2()
Dim targetRange As Range, refRange As Range, destRange As Range
Dim starttime As Long
Dim targetTable As Variant, refTable As Variant
Dim i As Long
Dim myDic As Object
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
starttime = GetTickCount
With Sheets("Sheet1")
Set targetRange = .Range(.Range("C2"), .Range("C" & .Rows.Count).End(xlUp)).Resize(, 7)
End With
With Sheets("Sheet4")
Set refRange = .Range(.Range("A2"), .Range("A" & .Rows.Count).End(xlUp))
End With
Set destRange = Sheets("Sheet5").Range("A1")
Set myDic = CreateObject("Scripting.Dictionary")
'高速化のためVariant配列に入れて置く
targetTable = targetRange.Value
refTable = refRange.Value
'辞書への収納
For i = 1 To UBound(targetTable, 1)
myDic(targetTable(i, 1)) = targetTable(i, 7)
Next i
'辞書引き
For i = 1 To UBound(refTable, 1)
'一旦Variant配列に受けて一括貼り付けすると更に20msec位速くなった
destRange.Offset(i - 1, 0).Value = myDic(refTable(i, 1))
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = False
Debug.Print CStr(GetTickCount - starttime)
End Sub
'3354 msec
Sub vlookup_vs_dic1()
Dim targetRange As Range, refRange As Range
Dim starttime As Long
Dim i As Long
Dim destRange As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
starttime = GetTickCount
With Sheets("Sheet1")
Set targetRange = .Range(.Range("C2"), .Range("C" & .Rows.Count).End(xlUp)).Resize(, 7)
End With
'refRangeの1000個もVariant配列に入れて試したが速度差は殆どなし
With Sheets("Sheet4")
Set refRange = .Range(.Range("A2"), .Range("A" & .Rows.Count).End(xlUp))
End With
Set destRange = Sheets("Sheet5").Range("A1")
For i = 1 To refRange.Rows.Count
destRange.Offset(i - 1, 0).Value = Application.WorksheetFunction.VLookup(refRange(i, 1).Value, targetRange, 7, False)
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = False
Debug.Print CStr(GetTickCount - starttime)
End Sub
お礼
ありがとうございます。回答が遅くやりすみません。助かりました!