こんにちは。ECF Tech担当
Michiharu.Tです。
Excel VBA入門の第9回です。
第8回から数回にわけ、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
実行すると下図のようになります。日付と時間の情報が保持されています。
日時データの活用
ここでは、日時データを活用するための関数をご紹介します。〇日後の日付を求めたり、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 = CDate(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に月が入ります。
- CDate関数を使って、指定された年月の初日の日付を取得しています。yearが2025、monthが6なら、
2025/06/01
という日付が作成され、変数dayに代入されます。 - dayの値を1日ずつ加算しながら出力します。これを30回くり返しています。
プログラムを簡易化するため、次の点を考慮していません。
- 日付は30日までしか表示されません。
- A1とC1に西暦と月が正しく入力されていない場合、エラーが発生します
A1に2025
、C1に6
を入力して実行すると、次のように表示されます。
図は一部のみですが、2025/06/30まで出力されています。本プログラムをさらに応用すれば、1年分の曜日付きカレンダーなどを、マクロ1つで出力することも可能です。
というわけで本日はここまでとさせて頂きたいと思います。最後までお読み頂きありがとうございました。ひきつづき、よろしくお願いいたします。