Excel VBAの「DateDiff 関数」について解説します。
DateDiff 関数とは
Excel VBA の DateDiff 関数は、2つの指定した日時の間隔を指定する単位の数を計算して返します。
DateDiff 関数の構文や引数の設定や実際の使い方について解説していきたいと思います。
DateDiff 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
引数
引数 | 説明 |
---|---|
interval | 【必須】間隔計算単位を表す設定値を指定します ※ 指定できる間隔設定値は下の表を参照ください |
date1, date2 | 【必須】間隔を計算する2つの日付を指定します ※ データ型は Variant (Date) です |
firstdayofweek | 【省略可能】週の開始曜日を定数(値)で指定します ※ 省略時の規定は、日曜日です |
firstweekofyear | 【省略可能】年度の第1週を定数(値)で指定します ※ 省略時の規定は、1月1日を含む週です |
引数 Interval に指定できる間隔設定値
設定値 | 内容 |
---|---|
yyyy | 年 |
q | 四半期 |
m | 月 |
d | 日 |
ww | 週(日曜日の数でカウント) |
h | 時 |
n | 分 |
s | 秒 |
y | 年間通算日 |
w | 週日(date1の曜日の数でカウント) |
引数 firstdayofweek に指定できる設定値
定数 | 値 | 内容 |
---|---|---|
vbUseSystem | 0 | 各国語サポート(NLS)API設定を使用 |
vbSunday | 1 | 日曜(既定値) |
vbMonday | 2 | 月曜 |
vbTuesday | 3 | 火曜 |
vbWednesday | 4 | 水曜 |
vbThursday | 5 | 木曜 |
vbFriday | 6 | 金曜 |
vbSaturday | 7 | 土曜 |
引数 firstweekofyear に設定できる設定値
定数 | 値 | 年度の第1週とする内容 |
---|---|---|
vbUseSystem | 0 | 各国語サポート(NLS)API設定を使用 |
vbFirstJan1 | 1 | 1月1日を含む週(既定値) |
vbFirstFourDays | 2 | 7日のう4日~6日が新年度に含まれる週 |
vbFirstFullWeek | 3 | 週全体が新年度に含まれる最初の週 |
戻り値
戻り値 | 説明 |
---|---|
計算結果の数値 | 戻り値の数値型は Long です |
解説(使用例)
それでは、Date1 にはこのサイトに記事を初投稿した「2020年5月30日 1:49:00」を設定します。
そして、Date2 には Now でコード実行日時を取得し、これまでの経過日時などを求めてみたいと思います。
DateDiff 関数の動作を確認するサンプルコード
'■DateDiff関数の動作確認サンプル
Sub DateDiff_Sample()
Dim d1 As Date
Dim d2 As Date
'kurumico.com 記事初投稿日時
d1 = #5/30/2020 1:49:00 AM# '2020年5月30日 1:49:00
Debug.Print "[d1]" & d1
d2 = Now 'このコード実行時の日時
Debug.Print "[d2]" & d2
'▼(d2-d1)/Interval
Debug.Print DateDiff("yyyy", d1, d2) & "年"
Debug.Print DateDiff("q", d1, d2) & "四半期"
Debug.Print DateDiff("m", d1, d2) & "月"
Debug.Print DateDiff("d", d1, d2) & "日"
Debug.Print DateDiff("ww", d1, d2) & "週"
Debug.Print DateDiff("h", d1, d2) & "時"
Debug.Print DateDiff("n", d1, d2) & "分"
Debug.Print DateDiff("s", d1, d2) & "秒"
'▼日付d1とd2の位置を入れ替えてみる
Debug.Print DateDiff("yyyy", d2, d1) & "年"
Debug.Print DateDiff("q", d2, d1) & "四半期"
Debug.Print DateDiff("m", d2, d1) & "月"
Debug.Print DateDiff("d", d2, d1) & "日"
Debug.Print DateDiff("ww", d2, d1) & "週"
Debug.Print DateDiff("h", d2, d1) & "時"
Debug.Print DateDiff("n", d2, d1) & "分"
Debug.Print DateDiff("s", d2, d1) & "秒"
End Sub
実行結果の イミディエイト 画像がこちらです。
・6行目、当サイト初投稿日時 “2020/05/30 1:49:00” を変数 d1 にセットしています。
※ 日付・時刻の前後に「#」をつけて表す「日付リテラル」で指定しています。
「日付リテラル」は #m/d/yyyy hh:mm:ss AM# のように指定します。
・8行目、変数 d2 にコード実行時の日時を代入しています。
▼(d2–d1)/Interval で各設定単位の計算を実行表示
・11~18行目までで、経過「年」数から「秒」数までを計算して表示させています。
▼日付 d1 と d2 の位置を入れ替えて実行させてみる
・20~27行目では、現在から見て初投稿時点までは何「年」前、何「秒」前だったのか計算しています。結果は、マイナスで表示されました。
※ date1 が date2 よりも後の時点を示す場合は、DateDiff 関数は負の数を返すことがわかりました。
コードの実行結果は、この上に表示しているイミディエイトの画像でご確認ください。
日付リテラルの使用について
date1 または date2 がシャープ記号 (#) で囲む「日付リテラル」の場合、指定した「年」はその日付の一部として恒久的に保存されます。 #mm/dd# のように年を省略して記述しようとすると、強制的に #mm/dd/yyyy# とyyyyが追加されます。 また、#yyyy/mm/dd# と記述すると #mm/dd/yyyy# に書き換わります。
date1 または date2 が二重引用符 (” “) で “mm/dd” のように年を省略して記述した場合、コードが実行されるたびにその時の「年」がコードに挿入さる点に注意しましょう。ただし、これを利用すれば別の年でも使用できるコードを記述することができます。
「日付リテラル」の書き方を表にしてみました。時刻を省略すると、午前12時0分0秒、日付を省略した時刻の場合、西暦1年1月1日が設定されます。
日付リテラル | 内容 |
---|---|
#3/1/2024 8:45:20 AM# | 2024/03/01 8:45:20 AM |
#3/1/2024# | 2024/03/01 12:00:00 AM |
#8:45:20# | 1/1/1 8:45:20 AM |
#15:50:15# | 1/1/1 3:50:15 PM |
Date など日付・時刻関数の使用例について
Date 関数のほか「日付・時刻」の関数について解説している過去記事があります。下記のリンクからジャンプしてご覧いただければ幸いです。
おわりに
VBAの関数一覧はこちらです。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA DateDiff 関数は、2つの日付の間隔を日数や時間など、指定した設定で計算してその数を返すということについて解説しました。
週を計算する場合、interval に “w” と “ww” のどちらを使うかで微妙な違いが出ます。
”w” なら「date1 の曜日」が date2 までの間にいくつあるかをカウントします。
“ww” なら「日曜日」が date2 までの間にいくつあるかをカウントします。
どちらの場合も date1 はカウントしません。
DateDiff 関数で年齢を求める場合、interval の “yyyy” は年度の差を1年としてカウントするので、まだ生年月日に達していない場合、間違った年令を返してしまいます。生年月日に達していない場合は、減算(-1)するなどの処理を入れる必要があります。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;