目次
はじめに
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型に変換することで、正しく不等号による比較ができるようになります。
この方法を使えば、「時間になったら処理を停止する」「時間前なら処理を許可する」といった制御が簡単に実装可能です。
少しでも参考になれば幸いです。