ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.30

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。

今回紹介するのは、「日付を計算する関数」です。

【目次】

  1. 日付を加算・減算する関数
  2. 日付と日付の間隔を計算する関数
  3. マクロサンプル

それでは、始めましょう!

日付を加算・減算する関数

日付を加算・減算する関数は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
[マクロ実行前]
[マクロ実行後]

今回の記事は以上になります。

それでは、また次回お会いしましょう!