0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Excel VBA】ブックを開くと自動で動くデジタル時計を安全に実装する ― Application.OnTime/CPU負荷考察付き ―

Posted at

はじめに

Excel VBAで「時計」を作ると聞くと、

CPU負荷が高そう

Excelが固まりそう

閉じても止まらなくなりそう

そんな不安を感じる人も多いと思います。

本記事では、
ブックを開いたら自動で動き、閉じると確実に停止するデジタル時計 を
Application.OnTime を使って 安全かつ低負荷 に実装する方法を紹介します。

業務ブックに組み込むことを前提に、
事故らない構成を重視しています。

完成イメージ

CLOCK.png

時・分・秒をそれぞれ2桁ずつ分解

「:」は固定セル

フォントサイズを大きくするとデジタル時計感が出ます

なぜ DoEvents ループを使わないのか

時計の実装でよく見かけるのが、次のような構成です。

Do
DoEvents
UpdateClock
Loop

この方法は簡単ですが、以下の問題があります。

CPUを常に回し続ける

停止制御が難しい

業務ブックに入れると危険

そこで本記事では Application.OnTime を使用します。

Application.OnTime を使う理由

Application.OnTime は、

「一定時間後に1回だけ処理を呼び出す」

仕組みです。

常時ループしない

待機中にCPUを占有しない

Excelが固まりにくい

1秒更新=常に処理している、ではありません。

実装コード(標準モジュール)

Option Explicit

Public NextTick As Date
Public ClockRunning As Boolean

Sub StartDigitalClock()
   ClockRunning = True
   UpdateDigitalClock
End Sub

Sub StopDigitalClock()
   ClockRunning = False
   On Error Resume Next
   Application.OnTime NextTick, "UpdateDigitalClock", , False
End Sub

Sub UpdateDigitalClock()
   If Not ClockRunning Then Exit Sub

   Dim t As Date
   Dim hh As String, mm As String, ss As String

   t = Now

   hh = Format(Hour(t), "00")
   mm = Format(Minute(t), "00")
   ss = Format(Second(t), "00")

   With Sheet1   ' ← シート名に合わせて変更
       .Range("B2").Value = Left(hh, 1)
       .Range("C2").Value = Right(hh, 1)

       .Range("E2").Value = Left(mm, 1)
       .Range("F2").Value = Right(mm, 1)

       .Range("H2").Value = Left(ss, 1)
       .Range("I2").Value = Right(ss, 1)
   End With

   NextTick = Now + TimeSerial(0, 0, 1)
   Application.OnTime NextTick, "UpdateDigitalClock"
End Sub

ブックを開いたら自動で動かす

ここが重要です。
ThisWorkbook に以下を記述します。

Private Sub Workbook_Open()
   StartDigitalClock
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   StopDigitalClock
End Sub

この構成にすることで、

ブックを開いたら自動スタート

閉じる前に必ず停止

OnTimeが残らない

という 安全な挙動 になります。

CPU負荷について(結論:問題なし)

1秒更新と聞くと、CPU負荷を心配する人もいます。

結論から言うと、
Application.OnTime を使った今回の実装では、問題になる負荷は発生しません。

理由は以下の通りです。

常時ループではない

待機中にCPUを占有しない

1回の処理が極端に軽い

実装方法の比較
実装方法 CPU負荷
DoEventsループ 高い
OnTime(本記事) ほぼ無し
分更新 実質ゼロ
業務で使う場合の注意点

常駐ブックでは更新頻度を下げる

秒表示が不要なら分更新にする

VDIや大量配布では配布数を意識する

使いどころを選べば、業務利用して問題ないレベル です。

まとめ

Excelで時計を作ること自体は珍しくありませんが、

自動起動

確実な停止

低CPU負荷

を満たす実装が重要です。

Application.OnTime を正しく使えば、
事故らないExcel時計 を作ることができます。

おわりに

「Excelでここまでやる必要ある?」と思うかもしれませんが、
こういう 小さな設計の積み重ね が、
業務マクロの安定性を大きく左右します。

▼こんなのも作っているので読んで行ってもらえるとうれしいです。
Excel VBAで進捗バーを実装する方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?