| 
    
     |  | こんにちは。 私のコードが速いのではなくて、"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
 
 |  |