• ベストアンサー

Excel=答えが日数で出ない

Excel2007 関数:締切日 E5=締切日:2011/12/10  F5=残り日数:1902/4/9 → 日数ででないので悩んでいます J5=Today:2009/9/1 式=DATEDIE(J5、E5、”d”) 教則本いわく、「ツール」→「アドイン」→「分析ツール」にチエック済み 日数の出し方教えて下さい 

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> 言い直します > 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で作る必要はありません。

winhi
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

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

すると、全ての回答が全文表示されます。
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.5

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

すると、全ての回答が全文表示されます。
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.3

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

すると、全ての回答が全文表示されます。
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.2

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

winhi
質問者

補足

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

すると、全ての回答が全文表示されます。
回答No.1

単純にF5の書式が日付形式になっているだけなので、書式を数値か 標準にすればオッケーです。

winhi
質問者

補足

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

すると、全ての回答が全文表示されます。

関連するQ&A