Microsoft 製品に組み込まれている Visual Basic の実装。
棚田優生 さま
Dictionary は重複したキーを登録できないため
表Bのすべての商品名を 商品名をキーとした
Dictionary に登録する ことはできません。
発想を変えればどうでしょうか?
(1) 表Aの方を Dictionary に登録する
(2) 表Bの商品名が Dictionary に存在する行だけを抽出する。
どうしても表Bのすべての商品名をDictionary に登録したい場合は
Dictionaryのキーを商品名、アイテムを同じ商品名の行番号の配列として
すでに登録済みの場合、配列に追加するようにすれば登録できます。
配列の定義が難しいかもしれませんが
ご参考になれば幸いです。
追記)2024 9/29 18:18
表B を Dictionary に格納する場合も、結局 18万回 Dictionaryに存在するかチェックすることになります。
結局、表A から作成した Dictionary を使用した方が速いと思います。
処理時間を短くするには、セルを1つずつ処理せずに2次元配列に変換して処理した方が効果的です。
VBA 高速化 配列 などをキーワードにして検索すると例があります。
例えば下記のようにすると18万回の検索もすぐに終わります。
追記)2024 9/30 8:20
質問の処理に近いように書き換えました。
長いですが、参考になれば幸いです。
| ' 入力 <br><br>Dim shtA As Worksheet <br><br>Dim arrayA As Variant <br><br> <br><br>Dim dicA As Dictionary <br><br>Dim keyA As String <br><br> <br><br>Dim shtB As Worksheet <br><br>Dim arrayB As Variant <br><br>' 出力 <br><br>Dim shtC As Worksheet <br><br>Dim rangeC As Range <br><br>Dim arrayC As Variant <br><br>Dim cntC As Long ' 出力行数 <br><br> <br><br>Dim i As Long <br><br>Dim j As Long <br><br> <br><br>'Dictionary用 入力 <br><br>Set shtA = ThisWorkbook.Worksheets("表A") <br><br>' セル範囲から値を配列に読み込む <br><br>arrayA = shtA.Range("A2:A100").Value <br><br> <br><br>'Dictionaryの作成 <br><br>Set dicA = New Dictionary <br><br>For i = LBound(arrayA) To UBound(arrayA) <br><br> If arrayA(i, 1) = "" Then <br><br> Exit For <br><br> End If <br><br> keyA = arrayA(i, 1) <br><br> If Not dicA.Exists(keyA) Then <br><br> dicA.Add keyA, "" <br><br> End If <br><br>Next i <br><br> <br><br>'入力 <br><br>Set shtB = ThisWorkbook.Worksheets("表B") <br><br>' セル範囲から値を配列に読み込む <br><br>arrayB = shtB.Range("A2:D180000").Value <br><br> <br><br>'出力 <br><br>Set shtC = ThisWorkbook.Worksheets("表C") <br><br>'とりあえず最大行数の配列を作成 <br><br>' 後で実際の行数に縮小する <br><br>Set rangeC = shtC.Range("A2:D180000") <br><br>arrayC = rangeC.Value <br><br>cntC = 0 <br><br> <br><br>For i = LBound(arrayB, 1) To UBound(arrayB, 1) <br><br> keyA = arrayB(i, 2) <br><br> If keyA <> "" Then <br><br> If dicA.Exists(keyA) Then <br><br> cntC = cntC + 1 <br><br> For j = LBound(arrayB, 2) To UBound(arrayB, 2) <br><br> 'arrayC(cntC, j) = "b" & arrayB(i, j) <br><br> arrayC(cntC, j) = arrayB(i, j) <br><br> Next j <br><br> End If <br><br> End If <br><br>Next i <br><br> <br><br>' サイズを変更したセル範囲に書き戻す <br><br>rangeC.ClearContents <br><br>If cntC > 0 Then <br><br> rangeC.Resize(cntC).Value = arrayC <br><br>End If |
|---|
以上