[[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


コメント返信:

[ 一覧(最新更新順) ]


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