[[20260630074735]] 『日付の計算(経過月日)を表示させたい』(ざっくばらん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『日付の計算(経過月日)を表示させたい』(ざっくばらん)

お願いします。
A1セルに2026/6/29 A2セルに2026/6/30 と入力してあるとします。
A1セルの日にちからA2セルの日付までどれ位経ったのか計算し
A3セルに表示させたいのです。

そこでA3セルに =A2−A1 の式を入力し計算させると

 1900/1/1  と表示されます。 この値を0/0/1もしくは00/00/01
と表示させたいのですがどのようにすればよいのでしょうか。

よろしく お願いします。

< 使用 Excel:unknown、使用 OS:unknown >


DATEDIF関数でいいと思う。
(匿名) 2026/06/30(火) 08:29:24

Option Explicit
Function f(d1 As Date, d2 As Date) As String
    Dim m, d
    Dim yyyymmdd1, yyyymmdd2, d3, d4
    m = DateDiff("m", d2, d1)
    If m > 0 Then
        m = m - 1
    End If

    yyyymmdd1 = DateSerial(Year(d1), Month(d1), 1)
    yyyymmdd2 = DateAdd("m", 1, d2)
    d3 = DateDiff("d", d2, DateSerial(Year(yyyymmdd2), Month(yyyymmdd2), 0))
    d4 = DateDiff("d", yyyymmdd1, d1)
    f = m & "/" & d3 + d4
End Function
Sub test()
Debug.Print f(CDate("2026/2/14"), CDate("2026/1/18"))
End Sub

イメージこんな感じのコードを微調整してくれたらいいと思うけど。
一か月の定義があいまいで処理としては成立してないと思うけどな。
(匿名) 2026/06/30(火) 09:00:01


 A3セルの書式が日付になっているからでしょう。
 それを(標準とかに)直せば、普通に日数が表示されるはずです。

(参考) 2026/06/30(火) 09:35:15


それじゃあだめだ、
1900年基準で月日が表示されるから駄目ですよ。
2026年2月1日〜2026年3月31日までを何か月何日経過と表示するかよく考えてみて。
1か月と〇日じゃだめだけど2か月と何日にするか議論が起こる。
(匿名) 2026/06/30(火) 09:43:15

https://support.microsoft.com/ja-jp/excel/get-started/calculate-the-difference-between-two-dates
を参照してください。
(参考) 2026/06/30(火) 10:36:33

皆さん ありがとうございます。
簡単に表示できると思ってたのですが、慣れていない私にはすこし大変なみたい。
でも、なんとかできそうです。ありがとうございました。
(ざっくばらん) 2026/06/30(火) 11:00:48

解決済みのようですが、
単純な日数では無く、DateSerialで月末やうるう年を顧慮したVBA
(DATEDIFでは、ズレあり)

Option Explicit

Sub 経過年月日を表示()

    Dim startDate As Date
    Dim endDate As Date
    Dim yy As Long, mm As Long, dd As Long
    Dim tmpDate As Date

    If Not IsDate(Range("A1").Value) Then
        MsgBox "A1に開始日を入力してください", vbExclamation
        Exit Sub
    End If

    If Not IsDate(Range("A2").Value) Then
        MsgBox "A2に終了日を入力してください", vbExclamation
        Exit Sub
    End If

    startDate = CDate(Range("A1").Value)
    endDate = CDate(Range("A2").Value)

    If endDate < startDate Then
        MsgBox "終了日は開始日以降を指定してください", vbExclamation
        Exit Sub
    End If

    yy = Year(endDate) - Year(startDate)
    tmpDate = DateSerial(Year(startDate) + yy, Month(startDate), Day(startDate))

    If tmpDate > endDate Then
        yy = yy - 1
        tmpDate = DateSerial(Year(startDate) + yy, Month(startDate), Day(startDate))
    End If

    mm = DateDiff("m", tmpDate, endDate)
    tmpDate = DateSerial(Year(tmpDate), Month(tmpDate) + mm, Day(tmpDate))

    If tmpDate > endDate Then
        mm = mm - 1
        tmpDate = DateSerial(Year(tmpDate), Month(tmpDate), Day(tmpDate))
        tmpDate = DateSerial(Year(tmpDate), Month(tmpDate) + mm, Day(tmpDate))
    End If

    dd = endDate - tmpDate

    Range("A3").Value = Format(yy, "00") & "," & Format(mm, "00") & "," & Format(dd, "00")

End Sub

(もうすぐ7月) 2026/06/30(火) 11:35:55


 A3:=TEXTJOIN("/",1,DATEDIF(A1,A2,{"Y","YM","MD"}))

 かな?

 datedifは日本の法に則ってないので正しくないですが、
 そもそも法定計算が面倒なんで。。。

 https://hibiki001.com/?p=3005
 https://addinbox.sakura.ne.jp/Excel_Tips05.htm#ktDATEDIF1
(ちくわ) 2026/06/30(火) 13:46:19

ありごうございます。うまくできました。
助けていただきありがとうございます。
みなさんすごいです。
(ざっくばらん) 2026/06/30(火) 15:17:06

1月30日のちょおど一か月後って2月28日なのかうるう年で2月29日なのか3月1日なのかみたいな問題、法定計算というのですね、勉強になりました。私など素人同然でして。
(匿名) 2026/06/30(火) 16:14:37

 うまくできましたか?

 期間計算の方法が明示されてないので、できるとは思わなかったのですが・・
 どなたの案を使って、何日から何日まで計算してみたのですか?

(半平太) 2026/06/30(火) 17:19:13


>この値を0/0/1もしくは00/00/01
>と表示させたいのですがどのようにすればよいのでしょうか
この様に表示する目的は何なんでしょうね。
(匿名) 2026/06/30(火) 19:40:56

もうすぐ7月さんので仮にやってみたらできましたので
それでやってみようと考えています。

目的ですが、保証の効く商品 例えば家電とか 購入リストがあるのですが
保証が3年とか5年とか10年とかあって、買ってからどれ位経っているのか
一目でわかるようにしたかったのです。

(ざっくばらん) 2026/07/01(水) 14:29:52


 解決されたようですが、ひとこと。

 A列に購入年月日があるとすると
 B2に  =DATEDIF(A2,TODAY(),"Y")
 C2に  =DATEDIF(A2,TODAY(),"YM")
 とすれば、経過年、経過端数月数が得られます。

 こうしておけば、オートフィルタで絞り込みなど簡単にできます。
 (文字列にしないほうがよいでしょう)

 質問にあたっては用途などを最初から書かれたほうがよいと思います。
 互いに貴重な時間を浪費せずに済みます。

 また、使用しているOSやExcelのバージョンなども明記されたほうが
 二度手間になりません。(この質問はたぶんバージョンは余り関係無いですが、
 一般的にはバージョンで使える関数が変わってくるのが普通です)

(xyz) 2026/07/01(水) 15:09:47


もうすぐ7月さんの 2026/06/30(火) 11:35:55のコードで
 A1 2025/6/30
 A2 2026/7/1
で試すと
 A3 01,00,-29
になります
01,01,-29 になるならわかります
ちくわさんの式だと 1/0/1 です

(とおりすがり) 2026/07/01(水) 15:46:50


修正版です。

Option Explicit

Sub 経過年月日を表示_up()

    Dim s As Date, e As Date
    Dim yy As Long, mm As Long, dd As Long
    Dim t As Date

    If Not IsDate(Range("A1").Value) Then
        MsgBox "A1に開始日を入力してください"
        Exit Sub
    End If

    If Not IsDate(Range("A2").Value) Then
        MsgBox "A2に終了日を入力してください"
        Exit Sub
    End If

    s = CDate(Range("A1").Value)
    e = CDate(Range("A2").Value)

    If e < s Then
        MsgBox "終了日は開始日以降を指定してください"
        Exit Sub
    End If

    yy = Year(e) - Year(s)
    t = DateSerial(Year(s) + yy, Month(s), Day(s))

    Do While t > e
        yy = yy - 1
        t = DateSerial(Year(s) + yy, Month(s), Day(s))
    Loop

    mm = 0
    Do While DateSerial(Year(t), Month(t) + mm + 1, Day(t)) <= e
        mm = mm + 1
    Loop

    t = DateSerial(Year(t), Month(t) + mm, Day(t))

    dd = e - t

    Range("A3").Value = Format(yy, "00") & "," & Format(mm, "00") & "," & Format(dd, "00")

End Sub
(もうすぐ7月) 2026/07/01(水) 18:38:14


 サンプルとして、
 スタート 2026/1/30 
 エンド  2026/3/1 として、

 「もうすぐ7月」さんの修正版と「ちくわ」さんの数式で算出してみると
 それぞれ 00,00,30 0/1/-1 となっています。(私の環境では)

 お二人とも1ヶ月経っていないと言う見解だと思いますが、
 2026年2月はまるまる経過しているのに1ヶ月も経っていないというのは
 おかしいと思えてしょうがないですが、なにか合理的理由があるのでしょうか?

(半平太) 2026/07/01(水) 21:08:36


 3月の基準日が3/1じゃなくて3/3(2/31日相当)になるというバグです。
 3/31 -> 翌年3/30の余りは27日くらいになります。

 合理的かどうかはわかりませんが。
 ちゃんと計算すると面倒。
 そもそも民法を適用しても
 ```
 143条
 〜週、月又は年によって期間を定めたときは〜
 ```
  ってあるように〇日後と〇か月後は同時に使わない

 ちなみに
 1/30,31 2/1 (うるう年は1/29も) 〜 3/1 は 全部ちょうど1か月です。(全部 0:00)

(ちくわ) 2026/07/01(水) 23:50:24


DateSerial は day=0 で前月末日を返し、
さらに 2/31 のような存在しない日付は 3/3 に繰り上がる仕様のようです。

再修正版。

Sub 経過年月日を表示()

    Dim s As Date, e As Date
    Dim yy As Long, mm As Long, dd As Long
    Dim t As Date

    If Not IsDate(Range("A1").Value) Then
        MsgBox "A1に開始日を入力してください"
        Exit Sub
    End If

    If Not IsDate(Range("A2").Value) Then
        MsgBox "A2に終了日を入力してください"
        Exit Sub
    End If

    s = CDate(Range("A1").Value)
    e = CDate(Range("A2").Value)

    If e < s Then
        MsgBox "終了日は開始日以降を指定してください"
        Exit Sub
    End If

    yy = 0
    Do While DateAdd("yyyy", yy + 1, s) <= e
        yy = yy + 1
    Loop

    t = DateAdd("yyyy", yy, s)

    mm = 0
    Do While DateAdd("m", mm + 1, t) <= e
        mm = mm + 1
    Loop

    t = DateAdd("m", mm, t)

    dd = e - t

    Range("A3").Value = Format(yy, "00") & "," & Format(mm, "00") & "," & Format(dd, "00")

End Sub

(もうすぐ7月) 2026/07/02(木) 11:41:00


 うるう年がらみのサンプルとして、
 スタート 2024/2/29
 エンド  2028/2/28 とした場合

 「もうすぐ7月」さんの仕様ては、年数は3年となるようです。
 すると期間は「03,11,xx」の形になると予想されるのですが、
 再修正版では「03,12,00」が返ってきます。

 この表記には少し違和感を覚えるのですが、そんなものなのでしょうか?

(半平太) 2026/07/02(木) 14:44:02


「03,12,00」では無く、「03,11,30」ですよね。

修正をうまく修正できないので疲れました。

私の手にはあまる問題なのでこの辺で手を引きます。

(もうすぐ7月) 2026/07/02(木) 15:55:09


 難しいですね
 考えてみました

   Function MyDateDIF(ByVal DayS As Date, ByVal DayE As Date) As Variant
     If DayS > DayE Then MyDateDIF = CVErr(xlErrCalc): Exit Function
     Dim dYY As Long, dMM As Long, dDD As Long

     dMM = 0
     Do Until DateSerial(Year(DayS), Month(DayS) + dMM, 0) = DateSerial(Year(DayE), Month(DayE), 0)
        dMM = dMM + 1
     Loop
     If Day(DayS) <= Day(DayE) Then
        dDD = Day(DayE) - Day(DayS)
     Else
        dDD = Day(DayE) + (DateSerial(Year(DayS), Month(DayS) + 1, 0) - DayS)
        dMM = dMM - 1
     End If
     dYY = dMM \ 12
     dMM = dMM Mod 12
     MyDateDIF = dYY & "/" & dMM & "/" & dDD
   End Function
(´・ω・`) 2026/07/06(月) 09:16:15

 だめでした 確認不足でした
 2026/1/30 〜 2026/2/28	→ 0/0/29
 2026/1/31 〜 2026/2/28	→ 0/0/28
 となりますが、ここは 0/1/0 にしたいところ

 月末の応当日の判定をどこかに入れないとだめでしたね
(´・ω・`) 2026/07/06(月) 09:38:31

 質問者さん(厳密には各メーカーの保証規定)が1年間の期間計算において、
 どう解釈しているか明らかにして貰うのが先だと思うのですが・・
 そうじゃないと、1日違いで保証が受けられなくなります。

 スタート 
  2027/2/28【月末】 

 保証最終日
  1.2028/2/27まで    (2028/2/28から保証外)
  2.2028/2/28まで    (2028/2/29から保証外)
  3.2028/2/29【月末】まで(2028/3/1 から保証外)

 これって、聞くまでもなく決まっている事なのですかね?

(半平太) 2026/07/06(月) 12:09:17


 あまり難しいことは考えてないんですが、
 
 宇宙戦艦ヤマトでも、「地球の滅亡まであとXXX日」としていたように
 カウントダウンするときには、あと○年□月△日 とはあまりしないようですね

   Function MyDateDIF(ByVal DayS As Date, ByVal DayE As Date) As Variant
     If DayS > DayE Then MyDateDIF = CVErr(xlErrCalc): Exit Function
     Dim dYY As Long, dMM As Long, dDD As Long

     dMM = 0
     Do Until DateSerial(Year(DayS), Month(DayS) + dMM, 0) = DateSerial(Year(DayE), Month(DayE), 0)
        dMM = dMM + 1
     Loop

     If Day(DayS) <= Day(DayE) Then
        dDD = Day(DayE) - Day(DayS)
     ElseIf Day(DateSerial(Year(DayE), Month(DayE), Day(DayS))) < Day(DayE) And DateSerial(Year(DayE), Month(DayE) + 1, 0) = DayE Then
        dDD = 0
     Else
        dDD = Day(DayE) + (DateSerial(Year(DayS), Month(DayS) + 1, 0) - DayS)
        dMM = dMM - 1
     End If
     dYY = dMM \ 12
     dMM = dMM Mod 12
     MyDateDIF = dYY & "/" & dMM & "/" & dDD

   End Function
(´・ω・`) 2026/07/06(月) 14:37:34

 民法なので絶対ではないですけどBtoCなら法より不利な契約は無効なので
 3か月保証と書いてあって同時に特約として「1か月は30日として計算する」
 と書いてあった場合に特約を根拠に90日で保証を拒否した場合は違法になりますが
 有利になる分には規制がないので自由ですが
  1か月は31日として計算するという特約がある場合
   3か月と1~2日 ではなく 93日 として期間を表現するので
 月や年の計算は決まってるって言っていいんですかね?

 大体の場合どこで期限が切れるかっていうのは期間の計算じゃなくて
  起算日 の計算が原因だと思いますけど

 あと○○までってときは ○○ が満了するまでのなので

 excelの場合シリアル値の関係で
  2026/1/30 0:00 〜 2026/2/28 0:00 となるので1か月経過してないですね
(ちくわ) 2026/07/07(火) 19:58:11

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.