VBAでDictionaryのデータを走査するループを速くする方法
久しぶりにVBAのプログラムを書いていて、ループの書き方で速度がものすごく違うのにびっくりしたのでメモ。
VBAでもDictionaryクラスを使うことができる。それをループで回すときの違い。
まず1万個のデータを作る。
このデータをワークシートのA列、B列に書き込むループを書く。
ループ1: インデックス変数を使う
ループ2:For Each を使う
ループ1とループ2の処理時間を計ってみると、驚くほど差があった。
1万個のデータをワークシートに書き込みをするのに2秒かかっているようで、ループ1のループを下記のように書き換えても60秒かかる。
ということで、DictionaryクラスではKeysメソッドは時間がかかるようだ。
VBAでプログラムを書くことは、もう、そんなにないだろうけど。
VBAでもDictionaryクラスを使うことができる。それをループで回すときの違い。
まず1万個のデータを作る。
- Dim di As Dictionary
- Set di = New Dictionary
- For i = 1 To 10000
- key = "ABC" & i
- di(key) = i
- Next
このデータをワークシートのA列、B列に書き込むループを書く。
ループ1: インデックス変数を使う
- Dim ws As Worksheet
- Set ws = Application.Worksheets("Sheet2")
- For i = 0 To di.Count - 1
- key = di.Keys(i)
- ws.Cells(i + 1, "A") = key
- Next
ループ2:For Each を使う
- Dim ws As Worksheet
- Set ws = Application.Worksheets("Sheet2")
- i = 0
- For Each v In di.Keys
- i = i + 1
- key = v
- ws.Cells(i, "B") = key
- Next
ループ1とループ2の処理時間を計ってみると、驚くほど差があった。
- ループ1 63秒
- ループ2 2秒
1万個のデータをワークシートに書き込みをするのに2秒かかっているようで、ループ1のループを下記のように書き換えても60秒かかる。
- For i = 0 To di.Count - 1
- key = di.Keys(i)
- Next
ということで、DictionaryクラスではKeysメソッドは時間がかかるようだ。
VBAでプログラムを書くことは、もう、そんなにないだろうけど。
コメント
コメントを投稿