Timerクラス

最近の働き方改革で夜遅くまでオフィスで仕事をしない人は関係ない話なので、この記事は読まなくても大丈夫です。

 

経過時間をざっくり計算するために一番簡単な方法はVBAのTimer関数です。たいていの人がこんな感じで済ませていると思いますが、これだと対応できないケースがあります。 

Double dStart As Double
Double dEnd As Double

dStart = Timer
.....
.....
dEnd = Timer
Debug.Print "Elapsed: " & dEnd - dStart 

ローカル変数で宣言してるけど、複数計測したい場合に変数を個数分宣言しなきゃいけないのは煩雑。そもそもタイトルがTimerクラスってなってるしw

残念でした。不正解です。日付をまたいだケースに対応できないが正解です。Timer関数は午前0時からの経過秒数を返してきます。そのため夜0時をまたぐと上記のdEnd - dStartがマイナスになってしまいます。

 

例: 23:55PMにプログラムを走らせて、0:05に処理が終わった。
dStart = Timer '(23*60+55) *60  = 86100
dEnd = Timer     '5 * 60 = 300
Elapsed: -85800   '300 - 86100

日付が変わるまでオフィスで仕事をしない人は関係ないと言った理由がお分かりいただけただろうか。自宅のPCで何か走らせたい人は下のコードをコピペしてください。

グローバルモジュールで関数を定義してもいいですが、それだと1箇所でしか計測できません。そのためにクラスにしておくとよいでしょう。

 

 

Option Explicit

Private m_dStartTime    As Double
Private m_dEndTime      As Double
 
' ---------------------------------------------
'   タイマー
' ---------------------------------------------
Public Sub StartTimer()
    m_dStartTime = Timer
    m_dEndTime = Timer
End Sub

Public Function ElapsedTime() As Double
    m_dEndTime = Timer
 
    If m_dEndTime - m_dStartTime < 0 Then
        ElapsedTime = m_dEndTime + (86400 - m_dStartTime)
    Else
        ElapsedTime = m_dEndTime - m_dStartTime
    End If

End Function