VBAでDictionaryのデータを走査するループを速くする方法

久しぶりに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でプログラムを書くことは、もう、そんなにないだろうけど。

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。