こんにちは。ECF Tech担当
Michiharu.Tです。
Excel VBA入門の第9回です。
第8回から数回にわけ、VBAで使用できる関数をご紹介しています。今回は日時を扱う関数をご紹介します。
本連載の目次は下記よりご覧頂けます。

[PR]
Excel VBAの実力を認定するVBAエキスパート試験の対策本です。

Date型の値を取得
日時を扱うにはまず、Date型の値を取得する必要があります。Date型は日時を扱うことのできるデータ型です。いくつかの関数でDate型の値を取得してみましょう。
Date関数
Date関数は本日の日付を返す関数です。但し、時間の情報は含みません。プログラム例を示します。
Sub today()
MsgBox Date
End Sub
この例では今日の日付を取得し、メッセージボックスに表示しています。実行すると次のようになります。

※実行する日によって、結果は図と異なります。
Now関数
Now関数は現在日時を返す関数です。プログラム例を示します。
Sub daytime()
MsgBox Now
End Sub

※実行する日時によって、結果は図と異なります。
時間の情報も含まれていることがわかります。
DateValue関数
DateValue関数は文字列からDate型の値を作る関数です。但し、時間の情報は保持されません。文法は次のとおりです。
DateValue("日付を表す文字列")
プログラム例を示します。
Sub strToDate()
Dim oneday As Date
oneday = DateValue("2025/06/12")
Msg oneday
End Sub
変数onedayをDate型として宣言しています。2025/06/12が日付情報として解釈され、日付データが変数onedayに代入されます。表示させると「2025/06/12」が表示されます。
一方、日付として判定できない文字列の場合はエラーになります。プログラム例を示します。
Sub failStrToDate()
Dim oneday As Date
oneday = DateValue("2025年06月12")
End Sub
実行すると次のようなエラーメッセージが表示されます。日本語が含まれており、日付データとして解釈できません。

CDate関数
CDate関数は、文字列からDate型の値を作る関数です。日時の情報が保持されます。文法は次のとおりです。
CDate("日時を表す文字列")
プログラム例を示します。
Sub strToDate2()
Dim oneday As Date
oneday = CDate("2025/10/10 15:10")
MsgBox oneday
End Sub
実行すると下図のようになります。日付と時間の情報が保持されています。

DateSerial関数
年、月、日の3つの情報を引数にして受け取り、日付情報を返します。プログラム例を示します。
Sub dateSerialTest()
Dim oneday As Date
Dim dayDiff As Integer
oneday = DateSerial(2025, 8, 20)
dayDiff = DateDiff("d", Date, oneday)
MsgBox dayDiff & "日差です"
End Sub
DateSerialの引数として2025、8、20を渡していますので、変数onedayには2025年8月20日にあたる日付情報が入ります。次のDateDiff("d", Date, oneday)で今日(Date)と何日の差があるかを求め、最後にその日数をメッセージボックスで表示しています。下は2020年8月8日に実行した結果です。

日時データの活用
ここでは、日時データを活用するための関数をご紹介します。〇日後の日付を求めたり、2つの日付の間の日数を求めたりすることができます。
DateAdd関数
日付に日数や月数を加算できます。文法は次のとおりです。
DateAdd("単位書式",加算する数値,日付データ)
単位書式の部分には、次のような値を使うことができます。
| 設定値 | 意味 |
|---|---|
| yyyy | 年 |
| m | 月 |
| d | 日 |
| h | 時 |
| n | 分 |
| s | 秒 |
プログラム例を示します。
Sub dayAdd()
MsgBox DateAdd("d", 7, now)
End Sub
現在日時から7日後の日時をメッセージボックスに表示しています。下の実行結果は「2025年6月12日」に実行したものです。

もう1つ例をご紹介します。
Sub monthAdd()
MsgBox DateAdd("m", 3, now)
End Sub
現在日時から3か月後の日時をメッセージボックスに表示しています。下の実行結果は「2025年6月12日」に実行したものです。

DateDiff関数
2つの日付の差を求めることができます。文法は次のとおりです。
DateDiff("単位書式",日付1,日付2)
単位書式にはDateAddで示した表のような文字列が使用できます。プログラム例を示します。
Sub dateDiff1()
Dim day1 As Date
Dim day2 As Date
day1 = CDate("2025/06/01")
day2 = CDate("2025/06/15")
MsgBox DateDiff("d", day1, day2)
End Sub
2025/06/01 ~ 2025/06/15 まで何日間あるかを求めています。実行するとメッセージボックスに14と表示されます。
もう1つ例を見てみましょう。
Sub dateDiff2()
Dim day1 As Date
Dim day2 As Date
day1 = CDate("2023/04/01")
day2 = CDate("2025/10/15")
MsgBox DateDiff("m", day1, day2)
End Sub
2023/04/01 ~ 2025/10/15 まで何ヶ月あるかを求めています。実行するとメッセージボックスに30と表示されます。
Year,Month,Day関数
日付情報から、年・月・日の情報を個別に取り出すことができます。各関数の使い方は次のとおりです。
Year(日付) Month(日付) Day(日付)
プログラム例を示します。
Sub yearMonthDay()
Range("A1").Value = Year(Date)
Range("A2").Value = Month(Date)
Range("A3").Value = Day(Date)
End Sub
今日の日付を年・月・日に分割し、それぞれをA1~A3のセルに代入するプログラムです。実行結果は次のようになります。

実践的な使い方
ここまで見てきた日付関連の関数を使い、実践的なプログラムを作ってみましょう。次のような入力フォーマットをあらかじめ用意し、年(A1セル)と月(C1セル)に値を入力してマクロを実行すると、指定年月のカレンダーを作成するプログラムです。

プログラムを示します。
Sub getMonthlyCalendar()
Dim year As Integer
Dim month As Integer
Dim day As Date
Dim i As Integer
'A1から年を取得
year = Range("A1").Value
'C1から月を取得
month = Range("C1").Value
'指定年月の初日をdayに代入
day = DateSerial(year, month, 1)
'30日分の日付を設定
For i = 1 To 30
Range("A" & (i + 1)).Value = day
'1日加算
day = DateAdd("d", 1, day)
Next
End Sub
プログラムの流れを示します。
- A1に西暦、C1に月を入力してマクロを実行します。
- 変数yearに西暦、変数monthに月が入ります。
- DateSerial関数を使って、指定された年月の初日の日付を取得しています。yearが2025、monthが6なら、
2025/06/01という日付が作成され、変数dayに代入されます。 - dayの値を1日ずつ加算しながら出力します。これを30回くり返しています。
プログラムを簡易化するため、次の点を考慮していません。
- 日付は30日までしか表示されません。
- A1とC1に西暦と月が正しく入力されていない場合、エラーが発生します
A1に2025、C1に6を入力して実行すると、次のように表示されます。

図は一部のみですが、2025/06/30まで出力されています。本プログラムをさらに応用すれば、1年分の曜日付きカレンダーなどを、マクロ1つで出力することも可能です。
というわけで本日はここまでとさせて頂きたいと思います。最後までお読み頂きありがとうございました。ひきつづき、よろしくお願いいたします。


