『日付の計算(経過月日)を表示させたい』(ざっくばらん)
お願いします。
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 >
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
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(火) 17:19:13
目的ですが、保証の効く商品 例えば家電とか 購入リストがあるのですが
保証が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
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
再修正版。
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
修正をうまく修正できないので疲れました。
私の手にはあまる問題なのでこの辺で手を引きます。
(もうすぐ7月) 2026/07/02(木) 15:55:09
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.