VBAで現在の時刻を比較して処理を分岐する方法【CDate × Time関数】

目次

はじめに

VBAで処理を組むときに、「現在の時間が○○時を過ぎていたら処理を中止する」といった、時間を使った条件分岐をしたいことがあります。
私も実際に、「17時を過ぎていたらデータの書き込みをさせないようにしたい」という要件があり、その方法を調べて実装してみました。


実現したいこと

  • 現在の時刻と制限時刻(例:17:00)を比較する
  • 現在が制限時刻を過ぎていたら処理を制限し、そうでなければ処理を実行

ポイント:CDateで文字列を時刻型に変換

VBAでは、CDate関数を使うことで、文字列や数値を日付・時刻型(Date型)に変換することができます。
この変換をしないと、文字列としての比較になってしまい、不正な結果が出る可能性があります


使用したコード

以下は、私が実際に使用したサンプルコードです。

Dim now_time, limit_time

now_time = CDate(Format(Time, "hh:mm:ss"))
limit_time = CDate("17:00:00")

If now_time > limit_time Then
    MsgBox "17時過ぎました。記入しないでね。"
Else
    MsgBox "17時前なので書き込めますよ"
End If

コードの解説

  • Dim now_time, limit_time
     → 現在時刻と制限時刻を保持する変数を宣言しています。
  • now_time = CDate(Format(Time, "hh:mm:ss"))
     → Time関数で現在の時刻を取得し、Format関数で時刻フォーマットに整えたあと、CDateでDate型に変換します。
  • limit_time = CDate("17:00:00")
     → 時刻リテラルを直接Date型に変換しています。
  • If now_time > limit_time Then
     → 時刻を比較し、現在が17時を過ぎていればTrueとなります。
  • MsgBox
     → 条件に応じて適切なメッセージを表示します。

よくあるミス:文字列のまま比較してしまう

私自身も最初は"17:00:00"といった文字列同士で比較しようとして、不等号(><)が正しく動作しない問題に悩まされました。

時刻として比較するためには、必ずDate型への変換(CDate)が必要です。
また、Format(Time, "hh:mm:ss")で正しい形式に整えることも忘れないようにしましょう。


応用のヒント

  • Time関数の代わりにNowを使えば、日付と時刻を含めた比較も可能です
  • 出力をMsgBoxではなく、セルへの書き込みや処理の中断にも応用可能です
  • 分単位や秒単位での比較も、同様の方法で対応できます

まとめ

VBAで現在時刻と任意の制限時刻を比較したい場合は、CDateを使って両方をDate型に変換することで、正しく不等号による比較ができるようになります。

この方法を使えば、「時間になったら処理を停止する」「時間前なら処理を許可する」といった制御が簡単に実装可能です。
少しでも参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次