Excel VBAで年月日の間隔(年/月/日/時間)を計算する

2022年1月8日

年月日間の期間を計算する際に「DateDiff」関数がよく使われますが、「DateDiff」関数だと年、月、日、時間ごとでしか計算できません。そこで「年・月・日・時間」で年月日間隔が表示できる関数を作成しましたのでご紹介します。例えば「2020/12/25 00:00:00」と「2021/12/25 15:10:05」を指定すると「01年00ヶ月00日15:10:05」の形式で計算されます。

関数の使い方

Function DATESPAN(startDate As Variant, endDate As Variant) As Variant

上記DATESPAN 関数に 「計算開始日」、「計算終了日」を設定して計算すると
〇〇年〇〇ヶ月〇〇日〇〇時間 という形で期間が計算できます。

VBAでコーディングすると以下のようになります。
まず計算開始日と計算終了日を指定して計算期間を指定します。
その後、 DATESPAN 関数を使って期間を求めます。

startDate = CDate(Format("1984/5/23 15:31:10", "yyyy/mm/dd hh:mm:ss"))  '計算開始日
endDate = CDate(Format("2021/12/19 14:30:20", "yyyy/mm/dd hh:mm:ss"))   '計算終了日

期間 = DATESPAN(startDate, endDate)   '期間計算結果を変数にセット
MsgBox 期間

【実行結果】
「1984/5/23 15:31:10」 と 「2021/12/19 14:30:20」 の期間の計算結果として以下のダイアログが表示され、答えとして「37年と6か月25日22時間59分10秒」が表示されます。

サンプルアプリの処理内容

下記画面の「日付期間計算」ボタンをクリックすると計算対象期間に設定されている日付間の期間を計算します。

サンプルコード   コードの作成手順はこちら

Option Explicit '変数の宣言を強制する

Sub 日付計算()
  
  Dim Sh1 As Worksheet  'ワークシート名
  Dim startDate As Date '計算開始日
  Dim endDate As Date   '計算終了日
  Dim i As Integer      'カウント変数
  
  
 '変数の定義とワークシートの指定
  Set Sh1 = ThisWorkbook.Worksheets("Sheet1")
    
 '6行目~11行目を計算
  For i = 6 To 11
    
    startDate = Sh1.Cells(i, 2) '計算開始日
    endDate = Sh1.Cells(i, 3)   '計算終了日
    
    '期間計算結果を年数、月数、日数、時間を切り分けてセルにセット
    Sh1.Cells(i, 4) = Left(DATESPAN(startDate, endDate), 2)
    Sh1.Cells(i, 5) = Mid(DATESPAN(startDate, endDate), 4, 2)
    Sh1.Cells(i, 6) = Mid(DATESPAN(startDate, endDate), 8, 2)
    Sh1.Cells(i, 7) = Mid(DATESPAN(startDate, endDate), 11, 8)
    
    '期間計算結果をセルにセット
    Sh1.Cells(i, 8) = DATESPAN(startDate, endDate)

  Next
       
End Sub


----------------------------------------------------------------------

Function DATESPAN(startDate As Variant, endDate As Variant) As Variant

   Dim Nen As Double   '年数
   Dim Tuki As Double  '月数
   Dim tu As Date
   Dim tis As Date
   Dim tie As Date
   Dim ds As Date
   Dim Days As Long  '日数
   Dim Jikan As Date '時間


  '年数
    Nen = Fix(DateDiff("m", startDate, endDate) / 12)
    
    
  '月数
    Tuki = (Year(endDate) * 12 + Month(endDate)) - (Year(startDate) * 12 + Month(startDate)) ' 年月を月数に直して概算
    tu = DateAdd("m", Tuki, startDate)           ' 開始日からxヵ月後
    If DateDiff("d", tu, endDate) < 0 Then
      Tuki = Tuki - 1
    End If
    
    Tuki = Tuki - Nen * 12
      
      
   '時間
    tis = TimeValue(CDate(CDate(startDate))) '計算開始日の時間部分を抽出
    tie = TimeValue(CDate(CDate(endDate))) '計算終了日の時間部分を抽出

    Jikan = TimeValue(CDate(CDate(endDate) - CDate(startDate))) '時間


    '日数
    '計算終了日の年月まで加算された計算開始日を求める。(例: 1995/05/10 15:31:10 → 2022/01/10 15:31:10)
    ds = DateAdd("m", Tuki, Left(endDate, 4) & Mid(startDate, 5, 14))
    
    '上記計算の結果、計算開始日が計算終了日を超えていたら計算開始日を1年マイナスする。
    If DateDiff("d", ds, endDate) < 0 Then
      ds = DateAdd("m", Tuki, Left(endDate, 4) - 1 & Mid(startDate, 5, 14))
    End If
    
    Days = DateDiff("d", ds, endDate)
    
    '計算開始日の時間が計算終了日の時間より大きかったら計算終了日から1日マイナスする。
    If tis > tie Then
     Days = DateDiff("d", ds, endDate - 1) '日
    End If
  
  
   '計算結果
    DATESPAN = Right(0 & Nen, 2) & "年" & Right(0 & Tuki, 2) & "ヶ月" & Right(0 & Days, 2) & "日" & Jikan
  
  
End Function