MENU

Excel VBA DateDiff関数 2つの日時の間隔を返す

Excel VBA DateDiff関数 2つの日時の間隔を返す

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 に指定できる設定値

定数値内容
vbUseSystem0各国語サポート(NLS)API設定を使用
vbSunday1日曜(既定値)
vbMonday2月曜
vbTuesday3火曜
vbWednesday4水曜
vbThursday5木曜
vbFriday6金曜
vbSaturday7土曜

引数 firstweekofyear に設定できる設定値

定数値年度の第1週とする内容
vbUseSystem0各国語サポート(NLS)API設定を使用
vbFirstJan111月1日を含む週(既定値)
vbFirstFourDays27日のう4日~6日が新年度に含まれる週
vbFirstFullWeek3週全体が新年度に含まれる最初の週

戻り値

戻り値説明
計算結果の数値戻り値の数値型は 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

実行結果の イミディエイト 画像がこちらです。

DateDiff_Smple 実行結果イミディエイト画像

・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 関数のほか「日付・時刻」の関数について解説している過去記事があります。下記のリンクからジャンプしてご覧いただければ幸いです。

おわりに

まとめ

Excel VBA DateDiff 関数は、2つの日付の間隔を日数や時間など、指定した設定で計算してその数を返すということについて解説しました。

週を計算する場合、interval に “w” と “ww” のどちらを使うかで微妙な違いが出ます。
”w” なら「date1 の曜日」が date2 までの間にいくつあるかをカウントします。
“ww” なら「日曜日」が date2 までの間にいくつあるかをカウントします。
どちらの場合も date1 はカウントしません。

DateDiff 関数で年齢を求める場合、interval の “yyyy” は年度の差を1年としてカウントするので、まだ生年月日に達していない場合、間違った年令を返してしまいます。生年月日に達していない場合は、減算(-1)するなどの処理を入れる必要があります。

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらです。

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!

よかったらシェアしてね!
  • URLをコピーしました!
目次