dポイントプレゼントキャンペーン実施中!

Excel2007
関数:締切日
E5=締切日:2011/12/10 
F5=残り日数:1902/4/9 → 日数ででないので悩んでいます
J5=Today:2009/9/1
式=DATEDIE(J5、E5、”d”)

教則本いわく、「ツール」→「アドイン」→「分析ツール」にチエック済み
日数の出し方教えて下さい 

A 回答 (6件)

> 言い直します


> 2/年3/17 で答えを出したいのです

2年3ヶ月9日ですね。datedif関数の解説を読みましょう。あなたの
書いた第3引数"D"が日数でした。答は830日。同様に、"M"だと27ヶ
月、"Y"だと2年という答が返ってきます。さらに、"MD"とか"YM"な
んてパターンもあります。

以上をふまえて、

=datedif(J5,E5,"Y")&"年"&datedif(J5,E5,"YM")&"ヶ月"&datedif(J5,E5,"MD")&"日"

のようにするわけです。VBAで作る必要はありません。
    • good
    • 0
この回答へのお礼

誠に有難うございました。
出来ました、感謝いたしております。

お礼日時:2009/09/02 11:21

2009/9/10


2010/3/5
0/年5/25

9月の残日数は20日 20日 + 3月の5日 で 25日
まてよ
2009年9月 の5ヶ月後 は 2010年の2月
2月の残日数は18日 18日 + 3月の5日 で 23日

???????????????????????

と言う矛盾がありますが。。。
J5の日がE5の日を上回った場合 J5があと何日で来月になるかで日数をだしてます。そっちのほうが違和感ないでしょ?ということで


1。
ツール(T) → マクロ(M) → visual basic editor で該当のワークシートにコピ&ペースト
2。
ツール(T) → オプション(O) → セキュリティタブ → マクロセキュリティ →セキュリティレベル → 中

テストは3分・・・・バグがあったら反省する。後悔はしない
当日は残0でいいよね?無駄にコメント書いてみた。

↓ 以下どうぞ
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Address = "$E$5") Or (Target.Address = "$J$5") Then 'E5 J5 に変更があった時
'If IsDate(Target.Value) = True Then '日付けだった場合
If IsDate(Range("E5").Value) And IsDate(Range("J5").Value) Then 'E5 J5 ともに日付けの場合

Range("F5").Value = 計算("F5", Range("E5").Value, Range("J5").Value)

End If
'End If
End If

End Sub

Function 計算(Target, E5, J5) As String

Dim E5_yy As Integer
Dim E5_mm As Integer
Dim E5_dd As Integer

Dim J5_yy As Integer
Dim J5_mm As Integer
Dim J5_dd As Integer


'分解
E5_yy = Left(E5, InStr(E5, "/") - 1)
E5 = Mid(E5, InStr(E5, "/") + 1)
E5_mm = Left(E5, InStr(E5, "/") - 1)
E5 = Mid(E5, InStr(E5, "/") + 1)
E5_dd = E5
J5_yy = Left(J5, InStr(J5, "/") - 1)
J5 = Mid(J5, InStr(J5, "/") + 1)
J5_mm = Left(J5, InStr(J5, "/") - 1)
J5 = Mid(J5, InStr(J5, "/") + 1)
J5_dd = J5



Dim yy As Integer
Dim mm As Integer
Dim dd As Integer


'年
yy = E5_yy - J5_yy

'月
If (E5_mm - J5_mm) < 0 Then 'J5_mmが8月でE5_mmが6月だった場合10ヵ月後なので
mm = 12 - (J5_mm - E5_mm)
yy = yy - 1 '年は一つ下がるよね!
Else
mm = E5_mm - J5_mm 'そのまま
End If

'日
If (E5_dd - J5_dd) < 0 Then 'もしJ5の日のほうが大きいなら

If mm = 0 Then 'もし月が0だった場合残りの月が-1になっちゃう
yy = yy - 1
mm = 11
Else
mm = mm - 1
End If
Dim lastday As Integer

lastday = last(J5_yy, J5_mm) 'J5の年月の最終日を求める とりあえずつきが繰り上がるまでの日数を。。
dd = E5_dd + lastday - J5_dd '20091002 - 200909 の場合 9月の最終日30 - 9 = 21  プラス 2
Else
dd = E5_dd - J5_dd 'そのまま
End If

計算 = yy & "/年" & mm & "/" & dd

End Function

Function last(yy, mm) As Integer

'Dim lastday() As integer = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
Dim lastday(13) As Integer

lastday(1) = 31
lastday(2) = 28
lastday(3) = 31
lastday(4) = 30
lastday(5) = 31
lastday(6) = 30
lastday(7) = 31
lastday(8) = 31
lastday(9) = 30
lastday(10) = 31
lastday(11) = 30
lastday(12) = 31


If mm = 2 Then 'もし2月なら
'もし4で割り切れてかつ100で割り切れない または 400で割り切れる 場合
If ((yy Mod 4 = 0) And (yy Mod 100 <> 0)) Or (yy Mod 400 = 0) Then
lastday(2) = 29 'うるう年なので2月は29日まで
End If
End If

last = lastday(mm) 'その月の最終日をセット

End Function
    • good
    • 0

なるほどそれですね



私はなんでもプログラムで解決しすぎるようです
昔々これを解決するプログラムを別の言語で作った経験があったものですから
Excelの関数をよく調べもせずに自作してしまうくせがあるようでう。目からうろこの回答でした
回答そをしに来て勉強しました。
ありがとうございました。
    • good
    • 0

つまり答えを2年3カ月と10日ですよという風に表示したいということなのでしょうか


(なぜ例が17日になるのかわからない)

やり方としては
それぞれを年、月、日に分ける
それぞれ引き算する
その時に「小学校の算数でならったように足りない時は上の桁から借りてくる」
つまり月が1-5となったら年から12借りてきて年の差-1を年にして
13-5とする、
日の計算も同様にする
このとき大の月、小の月、うるう年に配慮する
としてやっと計算できるのじゃないかと思うので
関数と式だけでやるのはかなりの難題です。
どうします?
暇があったらVBAで関数作ってもいいのですが...
    • good
    • 0

日数計算は間違っていません。


日数欄F5の書式が日付形式になっているので
標準、または数値に変えてください。
上記の例の通りだと
830
と出るはずです。
830日という意味です。

この回答への補足

説明不足で申し訳ありませんでした
< F5=残り日数:1902/4/9 → 日数ででないので悩んでいます
言い直します
2/年3/17 で答えを出したいのです
お力ぞいいただけますか 

補足日時:2009/09/01 16:56
    • good
    • 0

単純にF5の書式が日付形式になっているだけなので、書式を数値か


標準にすればオッケーです。

この回答への補足

説明不足で申し訳ありませんでした
< F5=残り日数:1902/4/9 → 日数ででないので悩んでいます
言い直します
2/年3/17 で答えを出したいのです
お力ぞいいただけますか 

補足日時:2009/09/01 17:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!