ExcelVBA超高速化技法か?

ExcelVBAで大量のデータ処理を行うと時間がかかって仕方のないことがあります。そこで少しでも速くする方法を思いついたので書きました。
結論
セルの値を大量に変えるときは変数を使おう。
以下、1~10000の和を求めるループを10回繰り返したときの時間を表示するプログラムです。Excel2000用なので他の環境での動作は不明です。動かすときはテキストエディタを使って全角スペースを半角スペースに置き換えましょう。
ここから~
Private Declare Function timeGetTime Lib ”winmm.dll” () As Long
Sub セル上で計算()
Dim i As Long
Dim j As Long
Dim t1 As Long
Dim t2 As Long
t1 = timeGetTime()
For i = 1 To 10
ActiveSheet.Cells(1, 3).Value = 0
For j = 1 To 10000
ActiveSheet.Cells(1, 3).Value = ActiveSheet.Cells(1, 3).Value + j
Next j
Next i
t2 = timeGetTime()
ActiveSheet.Cells(1, 1).Value = ”セル”
ActiveSheet.Cells(1, 2).Value = ”10000までの和”
ActiveSheet.Cells(1, 4).Value = ”かかった時間(ミリ秒)”
ActiveSheet.Cells(1, 5).Value = t2 - t1
MsgBox ”計算を終了しました。”
End Sub
Sub 変数上で計算()
Dim i As Long
Dim j As Long
Dim j_sum As Long
Dim t1 As Long
Dim t2 As Long
t1 = timeGetTime()
For i = 1 To 10
j_sum = 0
For j = 1 To 10000
j_sum = j_sum + j
Next j
Next i
t2 = timeGetTime()
ActiveSheet.Cells(3, 1).Value = ”変数”
ActiveSheet.Cells(3, 2).Value = ”10000までの和”
ActiveSheet.Cells(3, 3).Value = j_sum
ActiveSheet.Cells(3, 4).Value = ”かかった時間(ミリ秒)”
ActiveSheet.Cells(3, 5).Value = t2 - t1
MsgBox ”計算を終了しました。”
End Sub
~ここまで
私の家の環境では、セル上で計算の方のプロシージャを実行したところ17~35秒くらいかかりましたが、変数上で計算の方では(キャッシュにヒットすると?)1ミリ秒もかからないことが多いみたいです。
驚異の高速化?です。
セル同士で代入を繰り返すのと比較して、セルの値を変数へコピーし計算処理を行い、最終結果を再びセルにコピーし表示することは高速化に有効なようです。

広告