VBAで日付の比較・計算を行う方法、および注意点を説明いたします。
日付と認識できるかを判定する方法
まず、扱う変数がString型(文字列)の場合は、日付として認識できる文字列でないと、正しく扱えません。
そこで、扱う変数が日付以外の可能性がある場合は、IsDate関数で日付かどうかを判定できます。
Debug.Print IsDate("2025/3/16") '結果は「True」
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」
日付の比較方法
日付変数の場合
扱う変数が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月」として認識されるので、正しく比較できます。
文字列の場合
しかし、変数がString型(文字列)の場合は、形式が合っていないと正しく比較できません。
Dim St1 As String, St2 As String
St1 = "2025/3/1"
St2 = "2025/03/10"
Debug.Print St1 < St2 '結果は「False」
このような場合は、CDate関数を使って日付変数に変換すれば、正しく比較できます。
※日付として認識できない文字列に対してCDate関数を使うと、「型が一致しません」というエラーになります。
Dim St1 As String, St2 As String
St1 = "2025/3/1"
St2 = "2025/03/10"
Debug.Print CDate(St1) < CDate(St2) '結果は「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」
差分を計算する関数(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」
日付の形式変換(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」 和暦の省略形
コメント