【VBA中級】列を選んで転記する。連想配列を使ったコード!マクロ中級、連想配列

【VBA中級】列を選んで転記 3、連想配列にどうしてこだわる?列を自由に選んで別シートに転記するケース

連想配列を使って列を選んで転記する
連想配列を使って列を選んで転記する

転記における配列のコードと普通のコード、連想配列Dictionaryを使った場合の3通りを比較することで明らかになる

連想配列Dictionaryを使ったコードの解説

前の記事では、列を選んで別シートに転記するコードの配列のコードを解説しました。
このページは、連想配列Dictionaryを使ったコードの記事解説です。
【VBA中級】列を選んで転記 3、連想配列にどうしてこだわる?列を自由に選んで別シートに転記するケース、エクセルVBAの連想配列マジック!コードがスッキリで処理が高速化!マクロ中級

列を選んで転記 3、連想配列にどうしてこだわる?列を自由に選んで別シートに転記するケース

https://youtu.be/ywRSL3Z-KJM

大きな表から特定の列を選んで転記する-配列利用

1. 今回は最後のDictionaryを使って転記をする場合のコードの解説です。
比較しやすいように設定の条件は同じ条件でしています。

namae1

2. コード作成の流れは以下の手順です。同じデータを使っているので、変数や設定がほとんど同じになります。
何をするにしても、転記の場合にはこれぐらいの設定は全部やるというような設定内容です。


namae2

3. 辞書を使ったコードはこちらになります。最初の部分は変数の部分ですが、本当に全部一緒ですね。


namae3

4. まず最初に ソースシートのWorksheets("データ")と ターゲットシートのWorksheets("転記")を変数で区別しています。 それが、Dim srcWS As Worksheet, destWS As Worksheet というコードです。
SRCは ソース(source)は「源」や「起源」という意味です。
だから今回は source と destination ディスティネーションは目的地。
ターゲットとかも使いますけど ターゲットよりもディスティネーションの方が 一般的なようです。 そして次のコード、
Dim srcHeader As Range, destHeader As Range は ソースシートの見出し行であり、ターゲットシートの見出し行ということになります。

namae4

次は”srcLastRow”ソースシートの最終行で、”srcLastCol”は、最終列、そして”destLastCol ”は、 ターゲットシートの最終列を変数にしています。ここまでは、普通の方法と、配列を使った方法と完全に一緒です。

連想配列Dictionaryを使う

5.次に辞書の設定をします。辞書オブジェクトを作成して、データシートの見出しと列番号をセットする。
転記のためのマッピングしたということです。

namae5

6. それはどういうことかというと、こちらの図のようになります。

namae6

7. dicHeaderという辞書に、キーとしてValueを割り当て、 アイテムとしてその見出し名であるセルの列番号を割り当てました。
これがマッピングです。


namae7

8.上記のコードでは、ライブラリを使わない書き方になっています。

  Dim dicHeader As Object
  Set dicHeader = CreateObject("Scripting.Dictionary")
namae8

9. 下図は、辞書を可視化するために、ローカルウィンドゥで確認しています。

namae9

10.次に欲しい列を探す為のコードになります。
そして転記先の列の値、destWS.Cells(1, destCol).Value が辞書にあれば、転記元の列番号は、辞書のItemということになります。

namae10

辞書で転記すべき列を見つけ出す

11. 例えば、転記先の1列目は顧客IDなので、辞書で探すと、アイテムは1となり、 転記元の1列目のデータであることがわかります。
次の列はフリガナなので、辞書で探すと、アイテムは3となり、転記元シートの3列目のデータであることがわかります。 列を転記なので、そっくり列ごと転記できるのです。

  If dicHeader.Exists(destWS.Cells(1, destCol).Value) Then
  srcCol = dicHeader(destWS.Cells(1, destCol).Value)
  ' 一致する列が見つかった場合、データを転記
  srcWS.Range(srcWS.Cells(2, srcCol), _
          srcWS.Cells(srcLastRow, srcCol)).Copy destWS.Cells(2, destCol) 
End If
namae11

12.コードが理解できたところで、実行速度を図ってみましょう。
0.063秒でした。かなりの速さです。

namae12

13.もう一度連想配列を使った場合の転記速度を調べてみました。やはり0.063秒でした。
辞書を使うと、コードもすっきりしますし、転記速度も速くなりました。


namae13

14.次に、普通の転記方法で実行し処理時間を比較しました。結果は0.672秒でした。
これも決して遅くはありませんが、連想配列を使ったコードに比べて、10倍も時間がかかっています。

namae14

15. いかがでしたでしょうか?速度もあり、コードもすっきりする連想配列Dictionaryをぜひ使用してみてください。


namae15