• 締切済み

エクセルで、複数年にまたがる期間を、年ごとに日数計算できないかと思って

エクセルで、複数年にまたがる期間を、年ごとに日数計算できないかと思っています。 例:平成20年3月1日~平成21年5月10日を (1)平成20年3月1日~平成20年12月31日=○○日 (2)平成21年1月1日~平成21年5月10日=○○日 といった感じで、年ごとに自動的に分けて計算できる方法を探しています。(期間については、2~3年にまたがることもあります。) どなたか良い方法を教えていただけませんか?

みんなの回答

  • soixante
  • ベストアンサー率32% (401/1245)
回答No.4

#1の者です。 >Stday = Cells(1, 1).Value、Edday = Cells(1, 2).Valueの部分を変えればいいのでしょうか? はい。Stday はスタート日、Edday はエンド日としています。 他の部分もそれにあわせて変える必要はありますが、Cells というのは、R1C1形式ですので、丁寧に見ていただければ分かると思います。 念のため、簡単な解説コメントを足したコードを以下に記します。 #1の回答の代わりに以下を貼っても構いません。 VBAでは、文頭に’がついている文は解説文として色が変わりますのでコードには影響が出ません。 --------------------------------------------------------------------- Sub 日数計算() '変数宣言 Dim r As Integer, c As Integer, p As Integer Dim Stday As Date, Edday As Date On Error GoTo ErrShori '開始日、終了日のセット Stday = Cells(1, 1).Value Edday = Cells(1, 2).Value '前回分の内容を消す Range(Cells(2, 1), Cells(Rows.Count, 3)).ClearContents Cells(1, 3).ClearContents '開始日、終了日の関係によって場合分け処理 '開始日より終了日のほうが古い場合、エラーメッセージを出して終了 If Stday > Edday Then MsgBox "開始日と終了日の設定が間違っています。" Exit Sub '開始日と終了日が同じ場合 ElseIf Stday = Edday Then Range(Cells(2, 1), Cells(2, 2)).Value = Stday Cells(2, 3).Value = 0 '開始日と終了日が同じ年の場合 ElseIf Year(Stday) = Year(Edday) Then Cells(2, 1).Value = Stday Cells(2, 2).Value = Edday Cells(2, 3).Value = Cells(2, 2).Value - Cells(2, 1).Value + 1 '開始日と終了日が年が異なる場合 Else p = Year(Edday) - Year(Stday) + 1 Cells(2, 1).Value = Stday Cells(2, 2).Value = DateSerial(Year(Stday), 12, 31) Cells(2, 3).Value = Cells(2, 2).Value - Cells(2, 1).Value + 1 For r = 2 To p Cells(r + 1, 1).Value = DateSerial(Year(Stday) + r - 1, 1, 1) Cells(r + 1, 2).Value = DateSerial(Year(Stday) + r - 1, 12, 31) Cells(r + 1, 3).Value = Cells(r + 1, 2) - Cells(r + 1, 1) + 1 Next r Cells(p + 1, 2).Value = Edday Cells(p + 1, 3).Value = Cells(p + 1, 2) - Cells(p + 1, 1) End If 'A列、B列、C列の書式設定 Range(Columns(1), Columns(2)).NumberFormatLocal = "ggge年m月d日" Columns(3).NumberFormatLocal = "0" '経過日数の合計 With Cells(1, 3) .Value = Application.WorksheetFunction.Sum(Range(Cells(2, 3), Cells(Rows.Count, 3))) .NumberFormatLocal = "#,###" End With Exit Sub 'エラー(開始日・処理日に文字などを入力されたなど)発生時は終了させる ErrShori: MsgBox "エラーのため終了します" End Sub

jyango1
質問者

お礼

説明込みでわかりやすいです。ありがとうございます。 試してみます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

回答No2です。B2セルへの入力の式は次の式に訂正してください。 =IF(A2="","",IF(AND(ROW(A1)=1,A3=""),$B$1-$A$1+1,IF(AND(ROW(A1)=1,A3<>""),A2-$A$1+1,IF(A3<>"",A2-DATE(YEAR(A2),1,1)+1,$B$1-DATE(YEAR(A2),1,1)+1))))

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

A1セルに平成18年3月1日と入力し、B1セルに平成21年5月10日と入力するとします。 そこで、A2セルから下方にはその期間内に入る年号を表示させることにするのですがそのためには次のようにします。 A2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(COUNT($A$1:$B$1)<>2,"",IF(YEAR($B$1)>=YEAR(DATE(YEAR($A$1)+ROW(A1)-1,12,31)),DATE(YEAR($A$1)+ROW(A1)-1,12,31),"")) A2セルから下の行を平成18年というように表示させるためにはA2セルから下の行を範囲として選択したのちに右クリックして「セルの書式設定」から「表示形式」タブの「ユーザー定義」で種類の窓には ggge"年" と入力します。 そこでそれぞれの年における日数ですがB列に表示させることにしてB2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",IF(AND(ROW(A1)=1,A3=""),$B$1-$A$1+1,IF(AND(ROW(A1)=1,A3<>""),A2-$A$1+1,IF(A3<>"",A2-DATE(YEAR(A2),1,1),$B$1-DATE(YEAR(A2),1,1)+1))))

jyango1
質問者

お礼

回答、ありがとうございます。 来週、職場に行って試してみます。

  • soixante
  • ベストアンサー率32% (401/1245)
回答No.1

私なら、年数がまちまちになるのなら、マクロを使ってみます。 マクロはお使いになれますか? 念のためご存じないことを想定して以下に記します。 セッティング 【1】新規シート上で、Alt+ F11 (VBA画面があきます) 【2】Alt + I 、M (真っ白な画面が開きます) 【3】以下の点線から点線までをコピーし、その真っ白画面に貼る。 '--------------------------------------------------------------------- Sub 日数計算() Dim r As Integer, c As Integer, p As Integer Dim Stday As Date, Edday As Date On Error GoTo ErrShori Stday = Cells(1, 1).Value Edday = Cells(1, 2).Value Range(Cells(2, 1), Cells(Rows.Count, 3)).ClearContents Cells(1, 3).ClearContents If Stday > Edday Then    MsgBox "開始日と終了日の設定が間違っています。"  Exit Sub ElseIf Stday = Edday Then  Range(Cells(2, 1), Cells(2, 2)).Value = Stday  Cells(2, 3).Value = 0 ElseIf Year(Stday) = Year(Edday) Then  Cells(2, 1).Value = Stday  Cells(2, 2).Value = Edday  Cells(2, 3).Value = Cells(2, 2).Value - Cells(2, 1).Value + 1 Else  p = Year(Edday) - Year(Stday) + 1  Cells(2, 1).Value = Stday  Cells(2, 2).Value = DateSerial(Year(Stday), 12, 31)   Cells(2, 3).Value = Cells(2, 2).Value - Cells(2, 1).Value + 1  For r = 2 To p    Cells(r + 1, 1).Value = DateSerial(Year(Stday) + r - 1, 1, 1)   Cells(r + 1, 2).Value = DateSerial(Year(Stday) + r - 1, 12, 31)   Cells(r + 1, 3).Value = Cells(r + 1, 2) - Cells(r + 1, 1) + 1  Next r  Cells(p + 1, 2).Value = Edday  Cells(p + 1, 3).Value = Cells(p + 1, 2) - Cells(p + 1, 1) End If Range(Columns(1), Columns(2)).NumberFormatLocal = "ggge年m月d日" Columns(3).NumberFormatLocal = "0" With Cells(1, 3)  .Value = Application.WorksheetFunction.Sum(Range(Cells(2, 3), Cells(Rows.Count, 3)))  .NumberFormatLocal = "#,###" End With Exit Sub ErrShori: MsgBox "エラーのため終了します" End Sub '--------------------------------------------------------------------- 【4】Microsoft Visual Basic 画面を閉じて、エクセルに戻る。 セッティングは以上で終わり。 使用方法 【1】A1セルに、開始日を入力 例えば 2008/3/1 と入れる 【2】B1セルに、終了日を入力 例えば 2009/5/10 と入れる 【3】Alt + F8 を押す 【4】日数計算  を選択して、実行。「日数計算」をダブルクリックでも可。 試しに、A1セルに、ご自分の誕生日を、B1セルに、本日を入力した上で、実行してみてください

jyango1
質問者

お礼

回答、ありがとうございます。 VBAはほとんど知識がありません。 実際に使う場合、日付を入力する予定のセル場所はRICI形式でStday = Cells(1, 1).Value Edday = Cells(1, 2).Valueの部分を変えればいいのでしょうか?

関連するQ&A