【初心者向け】動かして学ぶExcel VBA入門(9)

Excel VBA

こんにちは。ECF Tech担当
Michiharu.Tです。

Excel VBA入門の第9回です。
第8回から数回にわけ、VBAで使用できる関数をご紹介しています。今回は日時を扱う関数をご紹介します。

本連載の目次は下記よりご覧頂けます。

【初心者向け】動かして学ぶExcel VBA入門
Excel VBAを動かしながら学べる連載をお送りしています。講座目次第1回Excel VBAとはExcelマクロを動かしてみようExcelマクロの保存第2回セルに値を設定セルの削除オブジェクト、プロパティ、メソッド第3回ワークシートの指定...

Date型の値を取得

日時を扱うにはまず、Date型の値を取得する必要があります。Date型は日時を扱うことのできるデータ型です。いくつかの関数でDate型の値を取得してみましょう。

Date関数

Date関数は本日の日付を返す関数です。但し、時間の情報は含みません。プログラム例を示します。

Sub today()
    MsgBox Date
End Sub

この例では今日の日付を取得し、メッセージボックスに表示しています。実行すると次のようになります。

Date関数

※実行する日によって、結果は図と異なります。

Now関数

Now関数は現在日時を返す関数です。プログラム例を示します。

Sub daytime()
    MsgBox Now
End Sub

Now関数

※実行する日時によって、結果は図と異なります。

時間の情報も含まれていることがわかります。

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

実行すると下図のようになります。日付と時間の情報が保持されています。

CDate関数

日時データの活用

ここでは、日時データを活用するための関数をご紹介します。〇日後の日付を求めたり、2つの日付の間の日数を求めたりすることができます。

DateAdd関数

日付に日数や月数を加算できます。文法は次のとおりです。

DateAdd("単位書式",加算する数値,日付データ)

単位書式の部分には、次のような値を使うことができます。

設定値 意味
yyyy
m
d
h
n
s

プログラム例を示します。

Sub dayAdd()
    MsgBox DateAdd("d", 7, now)
End Sub

現在日時から7日後の日時をメッセージボックスに表示しています。下の実行結果は「2025年6月12日」に実行したものです。

DateAddの例1

もう1つ例をご紹介します。

Sub monthAdd()
    MsgBox DateAdd("m", 3, now)
End Sub

現在日時から3か月後の日時をメッセージボックスに表示しています。下の実行結果は「2025年6月12日」に実行したものです。

DateAddの例2

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/012025/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/012025/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セル)に値を入力してマクロを実行すると、指定年月のカレンダーを作成するプログラムです。

日付関数実践例01

プログラムを示します。

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を入力して実行すると、次のように表示されます。

日付関連実践例02

図は一部のみですが、2025/06/30まで出力されています。本プログラムをさらに応用すれば、1年分の曜日付きカレンダーなどを、マクロ1つで出力することも可能です。

というわけで本日はここまでとさせて頂きたいと思います。最後までお読み頂きありがとうございました。ひきつづき、よろしくお願いいたします。

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