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

久しぶりにVBAのプログラムを書いていて、ループの書き方で速度がものすごく違うのにびっくりしたのでメモ。

VBAでもDictionaryクラスを使うことができる。それをループで回すときの違い。



まず1万個のデータを作る。

  1. Dim di As Dictionary
  2. Set di = New Dictionary
  3. For i = 1 To 10000
  4. key = "ABC" & i
  5. di(key) = i
  6. Next

このデータをワークシートのA列、B列に書き込むループを書く。

ループ1: インデックス変数を使う

  1. Dim ws As Worksheet
  2. Set ws = Application.Worksheets("Sheet2")
  3.  
  4. For i = 0 To di.Count - 1
  5. key = di.Keys(i)
  6. ws.Cells(i + 1, "A") = key
  7. Next

ループ2:For Each を使う

  1. Dim ws As Worksheet
  2. Set ws = Application.Worksheets("Sheet2")
  3.  
  4. i = 0
  5. For Each v In di.Keys
  6. i = i + 1
  7. key = v
  8. ws.Cells(i, "B") = key
  9. Next

ループ1とループ2の処理時間を計ってみると、驚くほど差があった。

  • ループ1 63秒
  • ループ2 2秒

1万個のデータをワークシートに書き込みをするのに2秒かかっているようで、ループ1のループを下記のように書き換えても60秒かかる。

  1. For i = 0 To di.Count - 1
  2. key = di.Keys(i)
  3. Next

ということで、DictionaryクラスではKeysメソッドは時間がかかるようだ。

VBAでプログラムを書くことは、もう、そんなにないだろうけど。

コメント

このブログの人気の投稿

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