こんにちは、Ryoです。
色々な処理や集計などで日付や時刻の間隔を計算して求めたいことは多々あるかと思いますが、VBAではDateDiff関数を利用することで取得することができますので、今回はその内容について書いていきます。
1.サンプル概要
セルA2,B2に期間を求めたい日付を入力し、セルD2~G2にそれぞれ年/月/日/週の間隔を表示します。
時刻についてもセルA5,B5に時刻を入力し、セルD5~F5に間隔を表示させます。
サンプルコードを実行すると下の画像のように、それぞれの求めたい間隔に応じた値が返されます。
以上がサンプル概要になります。
2.サンプルコード
◆日付間隔
Sub Sample1() Dim i As Integer Dim interv, Dt As String Range("D2").Select For i = 1 To 4 '間隔の単位(年/月/日/週)を取得 Dt = Cells(1, i + 3).Value '間隔単位に応じた引数を設定する Select Case Dt Case Is = "年" interv = "yyyy" Case Is = "月" interv = "m" Case Is = "日" interv = "d" Case Is = "週" interv = "ww" End Select '入力された日付1/日付2に対し、設定された引数での期間を算出 ActiveCell.Offset(0, i - 1) = _ DateDiff(interv, Range("A2").Value, Range("B2").Value) Next i End Sub
◆時刻間隔
Sub Sample2() Dim i As Integer Dim interv, Dt As String Range("D5").Select For i = 1 To 3 '間隔の単位(時/分/秒)を取得 Dt = Cells(4, i + 3).Value '間隔単位に応じた引数を設定する Select Case Dt Case Is = "時" interv = "h" Case Is = "分" interv = "n" Case Is = "秒" interv = "s" End Select '入力された時刻1/時刻2に対し、設定された引数での期間を算出 ActiveCell.Offset(0, i - 1) = _ DateDiff(interv, Range("A5").Value, Range("B5").Value) Next i End Sub
元データから間隔を求めて特定のセルに結果を出力するだけであれば、同じような記述が続く形になりますが以下でも同様の結果になります。
Sub Sample3() '日付間隔 Range("D2") = DateDiff("yyyy", Range("A2").Value, Range("B2").Value) Range("E2") = DateDiff("m", Range("A2").Value, Range("B2").Value) Range("F2") = DateDiff("d", Range("A2").Value, Range("B2").Value) Range("G2") = DateDiff("ww", Range("A2").Value, Range("B2").Value) '時刻間隔 Range("D5") = DateDiff("h", Range("A5").Value, Range("B5").Value) Range("E5") = DateDiff("n", Range("A5").Value, Range("B5").Value) Range("F5") = DateDiff("s", Range("A5").Value, Range("B5").Value) End Sub
このように日付や時刻の間隔を計算するには「DateDiff関数」を利用します。
構文:DateDiff(interval, date1, date2, firstdayofweek[, firstweekofyear]])
DateDiff関数は指定した期間(開始~終了)の間隔を返します。引数intervalには時間単位を表す文字列式を指定する形になります。
引数date1、date2には間隔を計算する期間(開始~終了)を指定し、引数firstdayofweekには週の始まりの曜日を表す定数、引数firstweekofyearには年度の第1週を表す定数をそれぞれ指定します。
≪引数interval設定値≫
設定値 | 内容 |
yyyy | 年 |
q | 四半期 |
m | 月 |
y | 年間通算日 |
d | 日 |
w | 週日 |
ww | 週 |
h | 時 |
n | 分 |
s | 秒 |
≪引数firstdayofweek設定定数≫
定数 | 値 | 内容 |
vbUseSystem | 0 | 各国語対応(NLS)API設定値 |
vbSunday | 1 | 日曜(既定値) |
vbMonday | 2 | 月曜 |
vbTuesday | 3 | 火曜 |
vbWednesday | 4 | 水曜 |
vbThursday | 5 | 木曜 |
vbFriday | 6 | 金曜 |
vbSaturday | 7 | 土曜 |
≪引数firstweekofyear設定定数≫
定数 | 値 | 内容 |
vbUseSystem | 0 | 各国語対応(NLS)API設定値 |
vbFirstJan1 | 1 | 1/1を含む周を年度の第1週(既定値) |
vbFirstFourDays | 2 | 7日のうち少なくとも4日が新年度に 含まれる週を年度の第1週 |
vbFirstFullWeek | 3 | 全体が新年度に含まれる最初の週を 年度の第1週 |
DateDiff関数の引数に指定する値や定数は以上のようになります。サンプルでは日付と時刻の間隔を求めているので、それに対応した値をSelect Caseで判定し計算する形としています。
「日」「週」などは間隔を返してくれますがサンプル結果で分かる通り、「年」に関しては単純な引き算の結果が返ってくるだけで期間ではないのでご注意ください。
3.まとめ
週や日、時刻の間隔などを求めるには使い勝手の良い関数ですので知っておくと役立つ場面は多々あると思います。
引数intervalの部分はサンプルコードで記述したように変数を用いることもできますので、扱いやすいですか何か機会があればぜひご活用ください。
以上、日付/時刻の間隔を取得する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo