Excelを使用していると、データ入力の訓練や課題の練習など、ストップウォッチ機能があったら便利・・・ということも多いでしょう。
実は私は普段パソコン講座なども行っていて、ワークにストップウォッチ機能があるととても便利と思うことがよくあります。
そこでこの記事ではExcelのストップウォッチ機能について、VBAのコードをコピペですぐに使えるよう、状況別に合わせてコードを作りました。
内容は画像付きで解説しますので、一つずつ見ていきましょう。
【基礎編】VBAを使ったストップウォッチ機能の挿入方法

最初は簡単なコードとして、上の画像のようなストップウォッチを作ります。
まずは以下のようにExcelに文字を入力します。

次に、Alt+11でVBAの入力画面を開き、標準モジュールを挿入します。

次に、以下のコードをコピペして貼り付けましょう。
Public StartTime As Date
Sub StartTimer()
StartTime = Now
Range("A4").Value = StartTime
End Sub
Sub StopTimer()
Dim EndTime As Date
EndTime = Now
Range("B4").Value = EndTime
Range("C4").Value = EndTime - StartTime
Range("C4").NumberFormat = "hh:mm:ss"
End Sub

ボタン挿入

マクロを動かしやすいように、ボタンを2つ挿入します。もしボタンの挿入方法が分からない場合はExcelでボタンを使ったマクロの簡単な作り方の記事を見てみましょう。
スタートにはStartTimerのマクロを登録し、ストップにはStopTimerのマクロを登録します。
実際にマクロを動かしてみると、以下のようになります。

ストップウォッチのコードの意味を解説
■ Public StartTime As Date
すべてのモジュール(プログラムのまとまり)から使える、『StartTime』という名前の日付・時刻型の変数を宣言する」という意味
■ Sub StartTimer()
スタートボタンに割り当てるマクロです。
● StartTime = Now
Now は「現在の日時」を返す関数
これを StartTime に保存しておきます
ストップ時に差を取るための基準になります
● Range(“A4”).Value = StartTime
スタートした時刻を A4 に表示します
Excelのセルに時刻が記録されるので、ログとしても使えます
■ Sub StopTimer()
ストップボタンに割り当てるマクロです。
● Dim EndTime As Date
ストップした時刻を入れる変数を用意します
● EndTime = Now
ストップボタンを押した瞬間の時刻を取得します
● Range(“B4”).Value = EndTime
ストップ時刻を B4 に表示します
● Range(“C4”).Value = EndTime – StartTime
経過時間は「ストップ – スタート」で求められます
Excelでは時刻は「1日=1」として扱われるため、差を取るだけでOK
● Range(“C4”).NumberFormat = “hh:mm:ss”
経過時間を「時:分:秒」で見やすく表示します
これを設定しないと、Excelの内部値(0.000123…のような小数)で表示されてしまいます。
日付を非表示にして秒を表示する方法

上の画像のように、スタートとストップの日付を非表示にして秒を出す方法を紹介します。その場合、コードを以下に差し替えます。
Public StartTime As Date
Sub StartTimer()
StartTime = Now
Range("A4").Value = StartTime
Range("A4").NumberFormat = "hh:mm:ss"
End Sub
Sub StopTimer()
Dim EndTime As Date
EndTime = Now
Range("B4").Value = EndTime
Range("B4").NumberFormat = "hh:mm:ss"
Range("C4").Value = EndTime - StartTime
Range("C4").NumberFormat = "hh:mm:ss"
End Sub
このようになります。

秒の表示をするコード解説
Range(“A4”).NumberFormat = “hh:mm:ss”のコードを入れることで、表示形式を設定することができます。hhは時、mmは分、ssは秒を指しています。
リセットボタンの設定
次はリセットボタンを設置する方法を紹介します。
以下のコードを追記しましょう。
Sub ResetTimer()
Range("A4:C4").ClearContents
End Sub

コードの意味は以下となります。
■ Sub ResetTimer()
リセットボタンに割り当てるマクロです
「ストップウォッチの値を初期化する処理」をまとめています
■ Range(“A4:C4”).ClearContents
A4 から C4 までの範囲をまとめてクリア
ClearContents は「値だけ消す」命令
→ セルの書式(時刻表示など)は残る
そのため、再スタートしても時刻表示が崩れません
ストップウォッチのスタート直後に一度リセットする方法
次はストップウォッチのスタートを押したら自動でスタートの時間がリセットされるようにします。
以下のコードを追記します。
' まずリセット
ResetTimer

ストップウォッチが続いているときの秒数をリアルタイム表示する方法

次は秒数をリアルタイムする方法を紹介します。
今度は最終的な完成のコードを紹介しますので、全てコードを差し替えましょう。
以下となります。
Public StartTime As Date
Public Running As Boolean
Sub StartTimer()
' リセットして開始
ResetTimer
' スタート時刻を記録
StartTime = Now
Range("A4").Value = StartTime
Range("A4").NumberFormat = "hh:mm:ss"
' 動作中フラグを立てる
Running = True
' 経過時間のリアルタイム更新開始
UpdateTimer
End Sub
Sub UpdateTimer()
' 停止中なら更新しない
If Running = False Then Exit Sub
' 経過時間を表示
Range("C4").Value = Now - StartTime
Range("C4").NumberFormat = "hh:mm:ss"
' 次の更新を予約(1秒ごと)
Application.OnTime Now + TimeValue("00:00:01"), "UpdateTimer"
End Sub
Sub StopTimer()
' 動作停止
Running = False
' ストップ時刻を記録
Range("B4").Value = Now
Range("B4").NumberFormat = "hh:mm:ss"
End Sub
Sub ResetTimer()
' 動作停止
Running = False
' A4〜C4 をクリア
Range("A4:C4").ClearContents
End Sub

ストップウォッチ完成版のコード解説
コードを解説します。
■ C4 は UpdateTimer でリアルタイム更新
Range("C4").Value = Now - StartTime
上記は秒数が動き続けるというコードです。
■ Application.OnTime で1秒ごとに更新
Application.OnTime Now + TimeValue("00:00:01"), "UpdateTimer"
Excel が固まらないように、
1秒後に再度 UpdateTimer を実行する予約を入れている。
■ StopTimer で更新を止める
Running = False
これがないと、止めても UpdateTimer が動き続けてしまう。
まとめ
今回はExcelのVBAを使用し、ストップウォッチを表示する方法を紹介しました。
練習や実務、プライベートなど幅広く使用することができますので、是非活用していきましょう。
以下のExcel記事もおすすめです。
