【VBA】日付と時刻の比較・計算方法

VBA

VBAで日付と時刻の比較・計算を行う方法、および注意点を説明いたします。

スポンサーリンク

日付・時刻と認識できるかを判定する方法

まず、扱う変数がString型(文字列)の場合は、日付・時刻として認識できる文字列でないと、正しく扱えません。
そこで、扱う変数が日付・時刻以外の可能性がある場合は、IsDate関数で日付かどうかを判定できます。

Debug.Print IsDate("2025/3/16")			'結果は「True」
Debug.Print IsDate("2025/3/32")			'結果は「False」
Debug.Print IsDate("2025.3.16")			'結果は「False」
Debug.Print IsDate("2025/03/16")		'結果は「True」
Debug.Print IsDate("20250316")			'結果は「False」
Debug.Print IsDate("2025年3月16日")		'結果は「True」
Debug.Print IsDate("令和7年3月16日")		'結果は「True」
Debug.Print IsDate("R7/3/16")			'結果は「True」

関数名が「IsDate」という名前ですが、「時刻のみ」の場合も、「日付+時刻」の場合も、書式が正しければ「True」を返します。

Debug.Print IsDate("2025/3/16 10:20:30")    '結果は「True」
Debug.Print IsDate("10:20:30")              '結果は「True」
Debug.Print IsDate("10:20")                 '結果は「True」
Debug.Print IsDate("10:60")                 '結果は「False」

日付・時刻の比較方法

日付変数の場合

扱う変数がDate型(日付変数)の場合は、何も考えずに不等号で比較できます。

Dim Dt1 As Date, Dt2 As Date
Dt1 = "2025/3/1"
Dt2 = "2025/03/10"

Debug.Print Dt1 < Dt2   '結果は「True」

「3月」の部分の形式をわざと変えて、「3月」と「03月」で比較しましたが、Date型のため、そんな事はお構いなくどちらも「3月」として認識されるので、正しく比較できます。

なお、こちらも変数の型が「Date型」という名前ですが、「時刻のみ」の場合も、「日付+時刻」の場合も、扱うことができます。
「9時」と「10時」で比較しましたが、ちゃんと「09時」と「10時」に読み替えてくれて、正しく比較できます。

Dim Dt3 As Date, Dt4 As Date
Dt3 = "9:50"
Dt4 = "10:10"

Debug.Print Dt3 < Dt4   '結果は「True」

Dim Dt5 As Date, Dt6 As Date
Dt5 = "2025/3/16 9:50"
Dt6 = "2025/3/16 10:10"

Debug.Print Dt5 < Dt6   '結果は「True」

文字列の場合

しかし、変数がString型(文字列)の場合は、形式が合っていないと正しく比較できません。

Dim St1 As String, St2 As String
Dim St3 As String, St4 As String

St1 = "2025/3/1"
St2 = "2025/03/10"

Debug.Print St1 < St2   '結果は「False」

St3 = "9:50"
St4 = "10:10"

Debug.Print St3 < St4   '結果は「False」

St1とSt2の比較では、「3月」の部分を「3」と「0」で比較してしまうので、「St1>St2」と判定されてしまいます。
また、St3とSt4の比較では、1文字目の「9」と「1」で比較してしまうので、「St3>St4」と判定されてしまいます。

このような場合は、CDate関数を使って日付変数に変換すれば、正しく比較できます。
※日付・時刻として認識できない文字列に対してCDate関数を使うと、「型が一致しません」というエラーになります。

Dim St1 As String, St2 As String
Dim St3 As String, St4 As String
Dim St5 As String, St6 As String

St1 = "2025/3/1"
St2 = "2025/03/10"

Debug.Print CDate(St1) < CDate(St2)   '結果は「True」

St3 = "9:50"
St4 = "10:10"

Debug.Print CDate(St3) < CDate(St4)   '結果は「True」

St5 = "2025/3/16 9:50"
St6 = "2025/3/16 10:10"

Debug.Print CDate(St5) < CDate(St6)   '結果は「True」

現在の日付と比較するときの注意点

現在の日付を求める方法として、Now関数Date関数があります。

  • Now関数:時間を含めて取得(例 2025/3/16 13:52:10)
  • Date関数:日付のみ取得(例 2025/3/16)

そのため、日付の部分のみを比較したい場合は、Date関数を使う必要があります。
Now関数を使うと、時刻を含めて比較してしまうため、意図した通りに比較できない可能性があります。

Dim Dt1 As Date
Dt1 = "2025/3/16"

'例:現在の日付が「2025/3/16の場合」
Debug.Print Dt1 < Now
'「2025/3/16 00:00:00」<「2025/3/16 13:52:10」のように
'時刻を含めて比較するため、結果は「True」

Debug.Print Dt1 < Date
'「2025/3/16」<「2025/3/16」のように
'日付の部分のみを比較するため、結果は「False」

日付と時刻の計算方法

日数のみを計算する場合

Date型(日付変数)に対して、「2日後」「2日前」のように日数のみを計算したい場合、何も考えずにそのまま加算・減算できます。

Dim Dt1 As Date
Dt1 = "2025/3/1"
Debug.Print Dt1 + 2     '2日後(結果は2025/3/3)
Debug.Print Dt1 - 2     '2日前(結果は2025/2/27)

また、引き算をすることで差分の計算もできます。

Dim Dt1 As Date
Dt1 = "2025/3/1"
Dt2 = "2025/3/4"
Debug.Print Dt2 - Dt1   '結果は「3」

加算・減算を行う関数(DateAdd関数)

DateAdd関数を使うと、日付だけでなく、年月や時間の加算・減算もできます。

記述方法

DateAdd(時間間隔, 追加する数値, 基準日時)

第1引数の「時間間隔」に設定できる値は、以下の通りです。

設定値内容
yyyy
q四半期
m
y年間通算日
d
w週日
ww
h
n
s

第2引数の「追加する数値」にマイナスの値を設定すると、過去の日付・時刻を求めることが出来ます。

Debug.Print DateAdd("m", 2, "2025/3/1")     '結果は「2025/5/1」
Debug.Print DateAdd("yyyy", -2, "2025/3/1") '結果は「2023/3/1」

Debug.Print DateAdd("h", 1, "10:10")           '結果は「11:10:00」
Debug.Print DateAdd("n", -5, "2025/3/1 10:10") '結果は「2025/03/01 10:05:00」

差分を計算する関数(DateDiff関数)

DateDiff関数を使うと、日付だけでなく、年月や時間の差分も計算できます。

記述方法

DateDiff(時間間隔, 日時1, 日時2[, 週の始まりの曜日[, 年の第1週]])
  • 第1引数の「時間間隔」は、DateAdd関数と同様です。
  • 第2引数・第3引数の2つの日付の差分を計算します。
  • 第4引数の「週の始まりの曜日」は省略可能です。(というか私は使ったことがありません。)
    省略すると「日曜日」になります。
  • 第5引数の「年の第1週」は省略可能です。(これも私は使ったことがありません。)
    省略すると「1月1日を含む週」になります。

Debug.Print DateDiff("m", "2025/3/1", "2026/4/1")       '結果は「13」
Debug.Print DateDiff("yyyy", "2025/3/1", "2026/4/1")    '結果は「1」

Debug.Print DateDiff("h", "10:10", "12:10")                   '結果は「2」
Debug.Print DateDiff("n", "2025/3/1 10:10", "2025/3/1 10:15") '結果は「5」

日付の形式変換(Format関数)

最後に、形式変換を行うFormat関数をご説明します。
ワークシート関数のText関数と、ほぼ同じことができます。

記述方法

Format(変換元の日付,変換したい書式)

第2引数の「変換したい書式」の詳細は、Microsoftの公式サイトに委ねるとして、具体例を見て頂いたほうがわかりやすいかと思います。

Debug.Print Format("2025/3/16", "yyyy/mm/dd")		'結果は「2025/03/16」月日にゼロを付けて2桁で表示
Debug.Print Format("2025/3/16", "yyyy/m/d")		'結果は「2025/3/16」 月日にゼロを付けずに表示
Debug.Print Format("2025/3/16", "yyyy/m/d(aaa)")	'結果は「2025/3/16(日)」曜日を表示
Debug.Print Format("2025/3/16", "ggge年m月d日")		'結果は「令和7年3月16日」和暦で表示
Debug.Print Format("2025/3/16", "ge/m/d")			'結果は「R7/3/16」   和暦の省略形

コメント

タイトルとURLをコピーしました