- 締切済み
次の計算を教えて下さい
エクセルで日数計算をする方法を教えて下さい。 計算結果で 月 日 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日」と計算ができる式を教えて下さい。 よろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- 30246kiku
- ベストアンサー率73% (370/504)
#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)
関数を作成した方が処理しやすかと思います。 各入力されているのは文字列だとして、また、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.2です。 補足の >文字列ではないのですが >A1 01年1ヶ月15日 >A2 00年1ヶ月20日 について確認したいのですが・・・ セルの表示形式はどのようになっていて、入力方法はどのようにしているのか? それによってやり方が変わってきます。 憶測で回答しても無意味になるような気がしますので、 今一度確認したうえで考えてみたいと思います。 というコトで具体的な回答ができなくてごめんなさいね。m(_ _)m
- bunjii
- ベストアンサー率43% (3589/8249)
- bunjii
- ベストアンサー率43% (3589/8249)
- bunjii
- ベストアンサー率43% (3589/8249)
>もう一つの方法も検討しています。 解答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)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 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
- shintaro-2
- ベストアンサー率36% (2266/6245)
月については、 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))&"日" といったところでは?
補足
ありがとうございます。 もう一つの方法も検討しています。 文字列ではないのですが 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日と算出します。 以上のような計算ができないか考えています。 よろしくお願いします。