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でプログラムを書くことは、もう、そんなにないだろうけど。
コメント
コメントを投稿