• 締切済み

次の計算を教えて下さい

エクセルで日数計算をする方法を教えて下さい。 計算結果で        月          日 A1   8ヶ月    B1    9日 A2   3ヶ月    B2   25日 A3   6ヶ月    B3   10日 A4 1年5ヶ月     1ヶ月14日 合計                   ※日の計算は、28・29・30・31日ありますが30日で計算します。 と合計の結果が出た場合 A5 1年6ヶ月14日 ← 1年5ヶ月+1ヶ月14日=1年6ヶ月14日 このように 「1年6ヶ月14日」と計算ができる式を教えて下さい。 よろしくお願いします。

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.9

#8です > 計算結果で 見落としてました。 "ヶ月" や "日" は書式で付加していたものになりますか。 であれば、#8の     sS = StrConv(r.Value, vbNarrow) ↓     sS = StrConv(r.Text, vbNarrow) として、書式を含めた文字列を扱うように変更すれば動くと思います。 なお、後半の     iAry(j, 0) = iAry(j, 0) - iAry(j, 1) * v(2) 部分は     iAry(j, 0) = iAry(j, 0) Mod v(2) でも同じです。 ※※ この関数の動きは不完全なようです。  というのは、#8にて > A5に、=CalcDay(A4:B4) もしくは =CalcDay(A1:B3) と記述していましたが、A1:B3 のどれかを変更した際、  =CalcDay(A4:B4) の方は表示が更新されませんね(2007 にて) 使いものにならないかも・・・ 失礼しました。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.8

関数を作成した方が処理しやすかと思います。 各入力されているのは文字列だとして、また、1ヶ月は30日固定解釈だとして A4に、=CalcDay(A1:A3) B4に、=CalcDay(B1:B3) A5に、=CalcDay(A4:B4) もしくは =CalcDay(A1:B3) とすると、見た目できたような気がすると思います。 以下記述を標準モジュールに転記します。 Public Function CalcDay(rng As Range) As String   Dim r As Range   Dim iAry() As Long   Dim vAry As Variant   Dim sS As String   Dim v As Variant   Dim i As Long, j As Long, k As Long   vAry = Array( _         Array("日", 1, 30, "日"), _         Array("月", 2, 12, "ヶ月"), _         Array("年", 3, 10000, "年") _       )   If (rng.Count < 2) Then Exit Function   ReDim iAry(3, rng.Count - 1)   ' 数字 → 数値解釈部分   k = 0   For Each r In rng     sS = StrConv(r.Value, vbNarrow)     For i = UBound(vAry) To 0 Step -1       If (Len(sS) = 0) Then Exit For       v = vAry(i)       j = InStr(sS, v(0))       If (j > 0) Then         iAry(v(1), k) = Val(sS)         sS = Mid(sS, j + 1)       End If     Next     k = k + 1   Next   ' 日、月、年 計算部分   CalcDay = ""   For Each v In vAry     j = v(1)     For i = 1 To UBound(iAry, 2)       iAry(j, 0) = iAry(j, 0) + iAry(j, i)     Next     iAry(j, 0) = iAry(j, 0) + iAry(j - 1, 1)     iAry(j, 1) = iAry(j, 0) \ v(2)     iAry(j, 0) = iAry(j, 0) - iAry(j, 1) * v(2)     If (iAry(j, 0) > 0) Then       CalcDay = iAry(j, 0) & v(3) & CalcDay     End If   Next '  CalcDay = StrConv(CalcDay, vbWide) ' 数字を全角にするならコメントを外す End Function ※ ソコソコ動くと思いますが、不都合あれば修正してください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.2です。 補足の >文字列ではないのですが >A1 01年1ヶ月15日 >A2 00年1ヶ月20日 について確認したいのですが・・・ セルの表示形式はどのようになっていて、入力方法はどのようにしているのか? それによってやり方が変わってきます。 憶測で回答しても無意味になるような気がしますので、 今一度確認したうえで考えてみたいと思います。 というコトで具体的な回答ができなくてごめんなさいね。m(_ _)m

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

度々申し訳ありません。 解答No5の画像が範囲を間違えていました。 再度差し替えです。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.5

解答No.4の貼付画像を間違えましたので訂正します。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.4

>もう一つの方法も検討しています。 解答No.2への補足で以下の条件を追加提示されましたので状況が理解できました。 A列の値はシリアル値で表示形式をユーザー定義でyy"年"m"ヶ月"d"日"になっていると推測します。 A列はシリアル値なのでそのままSUM関数または四則演算で加算できます。 但し、1900年1月1日を起算とした経過日数となるため1ヶ月を30日、1年を12ヶ月とする値と差が生じます。 従って、あなたの基準で日数を加算するには各シリアル値を日数に変換して加算しなければなりません。 また、合計日数を表示形式でnn年mヶ月d日の表示にすると此処でも誤差が生じますのであなたの基準で年数、月数、日数の置き換える必要があります。 01年1ヶ月15日=405日 00年1ヶ月20日=50日 --------------------- 合計         455日 シリアル値の場合は以下の通りになります。 01年1ヶ月15日=381日(1901/1/15) 00年1ヶ月20日=20日(1900/1/20) --------------------- 合計         401日(1901/2/4) 貼付画像の説明 A1セルにはDATE関数で =DATE(1,1,15) としてシリアル値に変換しました。 B1セルはA1セルの値を表示形式「標準」にしたものです。 C1セルはA1セルから1年を12ヶ月、1ヶ月を30日として日数を算出しました。 D1~F1セルはC1セルの日数から年数、月数、日数を算出しました C3セルはC1:C2の合計です。 A4セルにはDATE関数でD3,E3,F3を引数にしてシリアル値に変更しました。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.3

貼付画像のような計算表にすると良いでしょう。 質問の表はA1:B3に文字列で入力されていると仮定しました。 C列にはA列の月数×30+B列の日数としました。 C4はC1:C3の合計です。 A4にC4の合計日数から1年6ヶ月14日となる式を入力しました。 C1=LEFT(A1,FIND("ヶ",A1)-1)*30+LEFT(B1,FIND("日",B1)-1) C4=SUM(C1:C3) A4=INT(C4/30/12)&"年"&MOD(INT(C4/30),12)&"ヶ月"&MOD(C4,30)&"日"

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! A1~B3セルは文字列になっているのでしょうか? そうであれば数値に直すため、数式そのものがかなり長くなってしまいますので、 一案です。 A1~A3セルの表示形式はユーザー定義から 0"ヶ""月" としておいて数値のみの入力とします。 同様にB1~B3セルの表示形式はユーザー定義から 0"日" とし、こちらも数値のみの入力 もしDATEDIF関数を使用しているのであれば =DATEDIF(開始日,終了日,"M") のように数値のみの表示 そうしたうえで A4セルに =INT(SUM(A1:A3)/12)&"年"&MOD(SUM(A1:A3),12)&"ヶ月" B4セルに =INT(SUM(B1:B3)/30)&"ヶ月"&MOD(SUM(B1:B3),30)&"日" A5セルに =INT((SUM(A1:A3)*30+SUM(B1:B3))/360)&"年"&INT(MOD(SUM(A1:A3)*30+SUM(B1:B3),360)/30)&"ヶ月"&MOD(MOD(SUM(A1:A3)*30+SUM(B1:B3),360),30)&"日" という数式を入れると、↓の画像のような感じになります。 ※ 画像の黄色いセルは文字列になりますので、 計算には使用できません。m(_ _)m

mz-youg
質問者

補足

ありがとうございます。 もう一つの方法も検討しています。 文字列ではないのですが A1 01年1ヶ月15日 A2 00年1ヶ月20日 A3 01年3ヶ月5日(A1とA2の合計) という日数を入力して A3の部分に1年1ヶ月10日+00年1ヶ月20日+00年1ヶ月20 として 01年3ヶ月5日とする計算式があればと思っています。 日にちは28・29・30・31日がありますが、30日を基準に たとえば45日の場合は1ヶ月15日と算出します。 以上のような計算ができないか考えています。 よろしくお願いします。

  • shintaro-2
  • ベストアンサー率36% (2266/6245)
回答No.1

月については、 a1:a3の合計がa4に17ヶ月とあるとすると 日にちについては b1:b3の合計がb4に44日とあるとすると =int((a4+int(b4/30))/12)&"年"&(a4-12*int(a4+int(b4/30))/12)&"ヶ月"&(b4-30*int(b4/30))&"日" といったところでは?

関連するQ&A

専門家に質問してみよう