VBA100本ノック 70本目:ステータスバーに1秒ごとに時刻が表示
ブックが開かれたら、ステータスバーに1秒ごとに時刻を表示する問題です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。
出題
ブックが開かれたら、自動的にステータスバーに1秒ごとに時刻が表示されるようにしてください。
ただし、1分後には時刻表示を終了してください。
※セル入力中は、時刻は更新されなくて構いません。
VBA作成タイム
この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。
他の人の回答および解説を見て、書いたVBAを見直してみましょう。
頂いた回答
解説
つまりこれは時刻表示している間もセル入力出来なければならないという事です。
普通の方法としては2通りあります。
DoEvents関数
Application.OnTimeメソッド
まずはDoEvents関数から
時間計算と1秒ごとにする部分は様々だと思います。
Private Sub Workbook_Open()
Dim dtStart As Date: dtStart = Now()
Dim dtStop As Date: dtStop = DateAdd("s", 60, dtStart)
Dim dtNext As Date: dtNext = dtStart
Do While Now() <= dtStop
If Now() >= dtNext Then
dtNext = DateAdd("s", 1, dtNext)
Application.StatusBar = Format(Now(), "hh:mm:ss")
End If
DoEvents
Loop
Application.StatusBar = False
End Sub
1秒ごとにマクロを起動することで時刻表示させることが出来ます。
DoEventsとOnTimeは、どちらも一長一短はあります。
OnTimeのサンプルVBAと若干の解説を記事補足に書きました。
補足の下に「追記」に対応VBAを掲載しました。
補足
TimeやTimerを使った回答も見受けられましたが、これらは午前0時からの時刻なので0時を挟む可能性がある場合は都合が悪いことになります。
Application.OnTimeメソッド
実行中の大きな違いとしては、
・CPU使用
・カーソルのちらつき
・セル編集中の時刻更新
・VBE編集可否
・カーソルはちらつかない
・セル編集中も時刻更新される
・VBE編集はできない

・カーソルがちらつく
・セル編集中は時刻更新されない
・VBE編集できる
一長一短はありますが、1秒ごとに1分間ということならどちらでも良いと思います。
もし1分ごとに1時間というような場合は、DoEventsでは1時間マクロが動きっぱなしになってしまいますので、いささか都合が緩いように思います。
このような場合は、Application.OnTimeを使ったほうが良いでしょう。
したがって、1秒後の指定は、
Now() + 1秒
このように指定します。
※1秒の書き方はいろいろあります。
Private Sub Workbook_Open()
Call VBA100_70_01
End Sub
Public Sub VBA100_70_01()
Static dtStart As Date
If dtStart = 0 Then dtStart = Now()
If Now() > dtStart + DateSerial(0, 0, 60) Then
Application.StatusBar = False
Exit Sub
End If
Application.StatusBar = Format(Now(), "hh:mm:ss")
Call Application.OnTime(Now() + TimeSerial(0, 0, 1), "VBA100_70_01")
End Sub
上記では、Static変数を使っていますが、モジュールレベル変数を使っても良いでしょう。
追記

https://twitter.com/yamaoka_ss/status/1440344244267282453
最近のupdateで挙動が変化したようです。
本来、添付画像のようにOnTimeで切り離した方が良いのですが、本解答作成時には問題なかったので先の掲載のとうりとしていました。
※記事には本件を追記します。
※現在でも365以外(2019,2013,2010で確認)では問題なく動いています。
Private Sub Workbook_Open()
Application.OnTime [Now()+"0:0:0.1"], "VBA100_70_01"
End Sub
Sub VBA100_70_01()
Dim dtStart As Date: dtStart = Now()
Dim dtStop As Date: dtStop = DateAdd("s", 60, dtStart)
Dim dtNext As Date: dtNext = dtStart
Do While Now() <= dtStop
If Now() >= dtNext Then
dtNext = DateAdd("s", 1, dtNext)
Application.StatusBar = Format(Now(), "hh:mm:ss")
End If
DoEvents
Loop
Application.StatusBar = False
End Sub
Workbook_OpenでApplication.OnTimeを使うことにより次のプロシージャーを切り離しています。
したがってWorkbook_Openを抜けて終了するので、期待した通りに動作するようになります。
サイト内関連ページ
同じテーマ「VBA100本ノック」の記事
67本目:ComboBoxとListBox
68本目:全テキストボックスの転記
69本目:ダブルクリックでセル結合を解除
70本目:ステータスバーに1秒ごとに時刻が表示
71本目:パワーポイントへグラフを貼り付け
72本目:ITをDXに変換(文字列操作)
73本目:新規ブックにボタン作成しマクロ登録
74本目:1シート複数表をDB形式に変換
75本目:ログインフォームの作成
76本目:ボタンの表示名の位置へ移動
77本目:シート挿入イベント
新着記事NEW ・・・新着記事一覧を見る
生成AIが暴いた「VBAオワコン説」の盲点|問われるのは言語ではなく評価軸|エクセル雑感(2026-07-04)
【ITとは何か】Excel・VBAを学ぶ前に知っておきたい「4つの本質」|エクセル雑感(2026-06-24)
2つのシート名を交換するVBAをGeminiに作らせてみた。|VBA技術解説(2026-05-22)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法|VBAサンプル集(2026-05-20)
4大分岐関数の使い分け(IF/IFS/SWITCH/CHOOSE)|エクセル入門(2026-05-19)
Excel主要関数 習得難易度 10段階(文字列・日付除く)|エクセル雑感(2026-04-27)
Excelのシート5分類|エクセル雑感(2026-03-27)
グループ別に全員共通の重複期間を算出|エクセル練習問題(2026-03-12)
ハイフン区切り文字列の『最初』と『最後』を抽出・結合|エクセル練習問題(2026-02-23)
AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.日本の祝日一覧|Excelリファレンス
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.Excelショートカットキー一覧|Excelリファレンス
6.繰り返し処理(For Next)|VBA入門
7.RangeとCellsの使い方|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門
- ホーム
- マクロVBA入門編
- VBA100本ノック
- 70本目:ステータスバーに1秒ごとに時刻が表示
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.
