みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「日付を計算する関数」です。
【目次】
それでは、始めましょう!
日付を加算・減算する関数
日付を加算・減算する関数はDateAddです。
[書式]DateAdd(時間間隔, 数値, 基準日)
時間間隔には、加算・減算する時間間隔の設定値を入力します。
ここで設定した時間間隔の単位で、関数から値が戻ってきます。
設定できる時間間隔は複数ありますが、使用頻度の高いものを以下に挙げます。
| 設定値 | 内容 | 
| yyyy | 年 | 
| m | 月 | 
| d | 日 | 
| h | 時 | 
| n | 分 | 
| s | 秒 | 
数値には、基準日から追加または減少する数を設定します。
正数を入力すると基準日にその数が追加され、負数を入力すると基準日からその数が引かれます。
基準日には、日付型の変数もしくは日付を直接入力します。
以下は、DateAddを用いて現在時刻から1を加算・減算した結果です。
Sub ExcelVBA_030_Example1()
    Dim BufDate As Date
    BufDate = Now
    Debug.Print "===現在時刻に加算==="
    Debug.Print DateAdd("yyyy", 1, BufDate) 'y=年
    Debug.Print DateAdd("m", 1, BufDate) 'm=月
    Debug.Print DateAdd("d", 1, BufDate) 'd=日
    Debug.Print DateAdd("h", 1, BufDate) 'h=時
    Debug.Print DateAdd("n", 1, BufDate) 'n=分
    Debug.Print DateAdd("s", 1, BufDate) 's=秒
    Debug.Print "===現在時刻から減算==="
    Debug.Print DateAdd("yyyy", -1, BufDate) 'y=年
    Debug.Print DateAdd("m", -1, BufDate) 'm=月
    Debug.Print DateAdd("d", -1, BufDate) 'd=日
    Debug.Print DateAdd("h", -1, BufDate) 'h=時
    Debug.Print DateAdd("n", -1, BufDate) 'n=分
    Debug.Print DateAdd("s", -1, BufDate) 's=秒
End Sub
(↓イミディエイトウインドウの出力結果↓)

日付と日付の間隔を計算する関数
異なる日付の時間差を求める場合、DateDiff関数を使用します。
[書式]DateDiff(時間間隔, 日付1, 日付2)
時間間隔に設定する値はDateAdd関数と同じですので省略します。
日付1は日付計算の起点となる日付を、日付2には日付1の前または後の日時を設定します。
計算の起点(日付1)から日付2までの経過時間が関数の戻り値となります。
以下は、DateDiffで2020/4/1から現在時刻までの経過時刻を出力した結果です。
Sub ExcelVBA_030_Example2()
    Dim BufDate1 As Date
    Dim BufDate2 As Date
    BufDate1 = #4/1/2020# '日付1(計算の起点)
    BufDate2 = Now '日付2
    Debug.Print "経過した年数:", DateDiff("yyyy", BufDate1, BufDate2)
    Debug.Print "経過した年数:", DateDiff("m", BufDate1, BufDate2)
    Debug.Print "経過した年数:", DateDiff("d", BufDate1, BufDate2)
End Sub
(↓イミディエイトウインドウの出力結果↓)

マクロサンプル
サンプル 使用期限を過ぎた備品をチェックする
使用期限の設定された備品が、現時点で期限切れかそうでないかを表示します。
DateAddを用いて導入日+耐用年数で使用期限を求め、DateDiffで現在時刻と使用期限の差分を計算し、使用期限内or期限超過を出力します。
Sub ExcelVBA_030_Example3()
    Dim Cnt As Long
    Dim BufDate1 As Date
    Dim BufDate2 As Date
    Dim Limit As Long
    For Cnt = 2 To 4
        BufDate1 = Cells(Cnt, 3).Value '導入日
        Limit = Cells(Cnt, 4).Value '耐用年数
        BufDate2 = DateAdd("yyyy", Limit, BufDate1) '導入日+耐用年数=使用期限
        If DateDiff("d", Now, BufDate2) >= 0 Then '現時刻と使用期限の差分で判定
            Cells(Cnt, 5).Value = "期限内" '現時刻<=使用期限なら期限内
        Else
            Cells(Cnt, 5).Value = "期限超過" '現時刻>使用期限なら期限超過
        End If
    Next
End Sub
[マクロ実行前]


今回の記事は以上になります。
それでは、また次回お会いしましょう!




















