|
こんにちは。
私のコードが速いのではなくて、"Scripting.Dictionary"が速いのだと思います^ ^;
調べて、使いこなせるようになれば、いろんなところで役に立ちますヨ^ ^
でも、前に書きましたが、私も勉強中なので、詳しいわけではありません。
Scripting.Dictionary でNET検索してみてください。
http://www.interq.or.jp/student/exeal/dss/ref/wsh/scripting/dictionary.html
など、いろいろHITすると思います。
ついでに。自分のコードにコメントつけるのは苦手なのですが、何かの参考になれば。
Sub sample0()
Dim vA As Variant '比較(検索)先範囲を格納するために準備
Dim vD As Variant '比較元となる範囲を格納するために準備
Dim v As Variant '配列vDの個別要素Loop用
Dim vX As Variant '結果書き出し先の値を格納するために準備
Dim rD As Range '起点セル用
Dim myDic As Object '"Scripting.Dictionary"事後バインディング用
Dim i As Long, ii As Long 'Loopカウント用
'比較起点セルを変数にセット。(どちらかというと、記述を簡単にしたいから)
Set rD = Range("D1") 'ActiveCell
'比較対象範囲の値を=Range().Valueで2次元配列に格納。
With rD.Offset(, -3)
vA = Range(.Cells, .End(xlDown).Offset(, 1)).Value
End With
'比較元の値を2次元配列に格納。
With Range(rD, rD.End(xlDown))
vD = .Value
'結果書き出し先の値を2次元配列に格納。
With .Offset(, 1)
vX = .Value
'オブジェクトmyDicとして"Scripting.Dictionary"を作成。
Set myDic = CreateObject("Scripting.Dictionary")
'比較対象をdicに格納。この時、セル範囲から一旦配列に格納したものをLoopして高速化。
For i = 1 To UBound(vA)
'myDic.Exists(キー値)…キーが既にmyDicにあれば(重複していれば)Trueを返す。 _
なのでNot…重複していない時だけ、配列の2番目の次元(2列目と考えてください) _
の値をDictionaryのアイテムとして格納する。正式な書き方は↓?
'If Not myDic.exists(vA(i, 1)) Then myDic.Add Key:=vA(i, 1), Item:=vA(i, 2)
If Not myDic.exists(vA(i, 1)) Then myDic(vA(i, 1)) = vA(i, 2)
Next i
'比較元を格納した配列をLoopする。
For Each v In vD
'For...Each使用のため、配列要素数をカウントしながら。
ii = ii + 1
'Dictionary.Exists(キー値)=Trueで存在確認して、書き出し用配列にItemをセット。
If myDic.exists(v) Then vX(ii, 1) = myDic.Item(v)
Next v
'書き出し先セルをクリアする。(配列から書き出す時、一旦クリアしないと遅い)
.ClearContents
'配列から一括書き込み。
.Value = vX
End With
End With
Set myDic = Nothing
Set rD = Nothing
End Sub
|
|