VBAでコードを書いているとこんなことが気になったりします
・自分がExcelの機能、どれ位処理時間がかかっているか
・どれだけ効率化に貢献できたか。
・もしくはAのコードとBのコードどっちが速いのか。
そんなときにVBAでは経過時間を計測する方法がいくつか用意されています。
3つの計測方法
代表的な計測方法は以下の3つの方法があります。
・Now関数
・Timer関数
・GetTickCount関数
以下で使い方や特徴を1つずつ見ていきたいと思います。
計測方法
3つの関数の説明の前に時間の計測方法を説明したいと思います。
上記で紹介した3つの方法いずれも、使う関数は違えども計測方法はいずれも同じです。
Dim StartTime As variant '←適切な型の変数を使用してください '①計測開始時間を変数に記録 StartTime = Now '処理 '②終了時間から①の開始時間を引いて処理時間を算出 Debug.Print Now - StartTime
Nowと書かれた2箇所をそれぞれの関数に置き換えることで、いずれの関数でも処理時間が計測できます。
開始時間と終了時間を記録して、その差分を取ることで時間を計測しています。
Now関数
1つ目はVBAのNow関数を用いる方法です。 日付処理などをするときに見かけますので一番馴染みがあるかもしれません。
構文: Now
戻り値の型:Date型
システムの日時に基づいて現在の日時を指定する
Now関数は実行した時点の日付と時分秒を返してくれます。
最小単位が1秒なので、処理が1秒以内に終わると開始時間と終了時間に差がないため、処理時間が0秒と表示されます。
処理時間が長いマクロを計測する際には意味がありますが、時間計測に使用するにはちょっと有効性が低いです。
Timer関数
2つ目はTimer関数です。
構文: Timer
戻り値の型:Single型
午前 0 時からの経過秒数を表す単精度浮動小数点数型 ( Single ) の値を返します
最小単位は0.01秒です。
整数部分が秒。小数部分が1秒以下を表します。
(※Timer関数の返り値を格納する変数の型をDouble型にすると最小単位が0.00000001秒になります。
www.tipsfound.com
最小単位が1秒よりも短いため、Now関数と違い1秒以下の処理時間でも計測することが可能です。
但し時間の計測が午前0時を過ぎるとリセットされるので、日付を跨いで処理時間を計測していると正しい時間が算出できません。(あまり気にしなくてもいいとは思いますが
GetTickCount関数
最後3つ目はGetTickCount関数です。
これは上記2つとは違いVBAの機能ではなくAPIという、Windows自体の機能を利用するものです。
構文: GetTickCount
戻り値の型:DWORD型(符号無し32ビット整数型 0 ~ 4,294,967,295 )
Windowsを起動した後の経過時間をミリ秒(ms)単位で返す 。約49.7日でリセット。
最小単位は1ms(ミリ秒)です。1msは1,000の1秒です。
この関数は使用する前にしておく御作法があります。 モジュールの宣言エリアに
Declare Function GetTickCount Lib “kernel32” () As Long
と記載しておきます。
GetTickCount関数に限らずAPI関数を使用するときは、それぞれの関数にあった内容を宣言エリアに記載しておきます。 記載さえしておけば後はVBA関数と同じように使うことが出来ます。
この関数も数字がリセットされるときがあるのですが、約49日という超長時間ですのでVBAの処理時間計測で、そこまで計るときは無いと思いますので、少し手間はかかりますがGetTickCount関数を使用しておけば問題は発生しません。
まとめ
普段使いは気軽に使えて精度も高いTimer関数、超長時間や日跨ぎで計測する必要があるときはGetTickCount関数を使用するようにすれば、問題無く計測することが出来るのではないでしょうか。
自分の書いたコードの処理時間が速くなったとわかると結構テンション上がりますよ!