ステータスバーの更新頻度を下げて処理速度を向上させる:Excel VBA
Excel VBAでの進捗表示と言えばステータスバーに表示するのが便利ですが,意外と表示の更新処理は時間がかかっているようで,更新頻度を間引くと実行速度が速くなったりすることがあります。
しかし,Excelの処理速度を稼ぐために
If i mod 100 = 0 then
だのなんだの書くのはめんどくさいものです。
というわけで,ステータスバーの表示をいい感じに間引く関数を作りました。
Option Explicit
Declare Function QueryPerformanceFrequency Lib "kernel32" (frequency As Double) As Long
Declare Function QueryPerformanceCounter Lib "kernel32" (procTime As Double) As Long
Function GetMicroSecond() As Double
Dim procTime As Double '// 高分解能パフォーマンスカウンタ値(システム起動からの加算値)
Dim frequency As Double '// 高分解能パフォーマンスカウンタの周波数(1秒間に増えるカウントの数)
Dim ret As Double '// 計測結果
'// 計測時刻を0で初期化
GetMicroSecond = 0
'// 更新頻度を取得
Call QueryPerformanceFrequency(frequency)
'// 処理時刻を取得
Call QueryPerformanceCounter(procTime)
'// カウンタ値を1秒間のカウント増加数で割り、正確な時刻を算出
GetMicroSecond = procTime / frequency
End Function
Sub StatusBarUpdate(msg As String, Optional wait_sec As Double = 0.1)
Static StatusBarUpdate_LastUpdateTime As Double
Dim now_time As Double
now_time = GetMicroSecond
If now_time - StatusBarUpdate_LastUpdateTime > wait_sec Then
Application.StatusBar = msg
StatusBarUpdate_LastUpdateTime = now_time
DoEvents
End If
End Sub
いい感じに間引くというか,ステータスバーの前回更新時間が0.1秒以内だったら更新しないというだけの関数です。
時間の取得に必要な関数は こちらの「VBAでミリ秒やマイクロ秒の計測を行う」というページで紹介されているコードを使いました。
0件のコメント