- ベストアンサー
EXCEL2003で日付計算(難易度高)
EXCEL2003で日付計算を行っているのですが、 指定した日(開始日)から日曜日と祝日を除いた7日後(Aとします)を表示させ、 その日から指定した日(終了日)までの日数を求めたいのですが 何かよい式はないでしょうか? ちなみにAから終了日までは日曜日も祝日も含みます。 開始日 7/10 7日後 7/17 終了日 7/22 7/17~7/22日数は7/17を含めるため7です。 通常の引き算だとA(7/17)を含まず6と表示されてしまいます。
- みんなの回答 (8)
- 専門家の回答
みんなが選んだベストアンサー
開始日が7/10のときに、日曜日と祝日を除いた7日後は7/18になると思うのだが、どうして7/17なんだろう?もしかすると単純に7日後を求めてその日が日曜日か祝日になるときは次の日にするってこと? 7/17から終了日 7/22 までの日数は6だと思うんだけど、どうして7なのか?
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >日曜日の12日を省いて7日間数えます。 >そして出た日付以降の日~終了日まで求めます。 >例だと18日~31日まで やっと分かりました。(^^;それは、前回のご質問の内容で、レスが付かないので、質問しなおしたわけですね。 A1:起算日 B2:祭日を抜く7日 A3:締日 ------------------------------------------- A2: =SMALL(IF((WEEKDAY(A1+ROW($A$1:$A$20)-1,2)<7)*ISERROR(MATCH($A$1+ROW($A$1:$A$20)-1,holiday,0)),$A$1+ROW($A$1:$A$20)-1,""),B2) B3; =A3-A2+1 これで、良いと思います。
お礼
回答ありがとうございます。 さっそく試してみたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 私は、読み間違えたかもしれません。 >日曜日と祝日を除いた7日後(Aとします)を表示させ、 ご質問からは、その意図を理解できませんでしたから、他の方の回答の反応を参考にしました。日数を出すのですか? #4 の図を元にして、 =SUMPRODUCT((WEEKDAY($A$1+ROW(OFFSET($A$1,0,0,$A$2-$A$1+1))-1,2)<7)*ISERROR(MATCH(A1+ROW(OFFSET($A$1,0,0,$A$2-$A$1+1))-1,holiday,0))) A1;起算日 A2;終了日 Holidayは、休日/祭日リスト 数式中の [<7 ]は、土曜日は含み、日曜日は除くという計算です。 土曜日も数えないなら、Workday 関数というものがあります。
お礼
回答ありがとうございます。 日曜日と祝日を除いた7日後というのは たとえば 開始日7/10 終了日7/31 だとすると 7/10・11・13・14・15・16・17 という風に日曜日の12日を省いて7日間数えます。 そして出た日付以降の日~終了日まで求めます。 例だと18日~31日まで =SUMPRODUCT()の式はこれから試させていただきます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
ご質問で開始日が7/10で7日後が7/17というのはおかしいのではないでしょうか?必ず間に日曜日が入りますので通常では7/18になりますね。また、7日後が7/17として、終了日の7/22までは7ではなくて6ではないでしょうか? 7日後が7/18で7/22までですから正解は5ではないでしょうか? ところで求めるための式ですがA1セルに開始日がB1セルに終了日があるとしたら終了日までの日数は次の式で良いでしょう。 なお、祝日についてはE1セルから下方に日付順に並んで下方に入力されているものとします。 =B1+1-(A1+8+(MATCH(VLOOKUP(A1+8,E:E,TRUE),E:E,0)-MATCH(VLOOKUP(A1,E:E,TRUE),E:E,0)))
お礼
回答ありがとうございます。 7/10から7日後ですが、説明が足りず申し訳ありません。 7/10・11・13・14・15・16・17 開始日を含めるので17が7日後とします。 7/17~22までは確かに6ですね.....勘違いしてました。 式はこれから試してみようと思います。
補足
またまたすみません。 7日後は18日でした。勘違いしてました.....
- Wendy02
- ベストアンサー率57% (3570/6232)
#4 の回答ですが、修正します。 数式が間違っていました。 片入れでは、計算がヘンです。検算してみると、当日が、休みの日の場合と、その前の日で同じになるというのは、ありえないからです。だから、当日をチェックしないと合いませんでした。 =SMALL(IF((WEEKDAY(A1+ROW(A1:A200)-1,2)<7)*ISERROR(MATCH(A1+ROW(A1:A200)-1,holiday,0)),A1+ROW(A1:A200)-1,""),B2) 要配列確定
お礼
回答ありがとうございます。さっそく試してみたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ある程度、掲示板では知られた質問のひとつだと思います。 以下は、私が、昔、別の掲示板に参加した頃に作ったものです。たぶん、もう新しい数式を思いついている人もいるとは思います。私は、関数は、もう遠ざかって得意ではありません。 あまり、長い期間ですと、数式で配列数式ですので負担が大きすぎますが、1ヶ月~1年ぐらいなら、祭日を登録すれば関数で可能です。VBAでは、祭日計算から始まりますから、かなり大掛かりなVBAにはなってしまいますが、かなり先まで、計算可能だと思います。 祭日をリストに入れている限りの範囲程度の範囲でしたら、可能です。また、私が、名前「holiday」で使っている下記の日付は、計算で出しているものです。ただし、国の取り決めで、春分の日、秋分の日はずれることがあるそうです。 図を参考にしていれてみてください。 注:以下は、A200 となっていますから、200日先まで計算が可能だということです。ROWの引数は、仮の数ですから、数式がどこにあっても、必ず、A1を先頭にしなくてはなりません。 なお、日付の計算は、一般的な片入れになっていますから、その日は加えません。 '------------------------------------------- A1: 2009/7/10 A2: =SMALL(IF((WEEKDAY(A1+ROW(A1:A200),2)<7)*ISERROR(MATCH(A1+ROW(A1:A200),holiday,0)),A1+ROW(A1:A200),""),B2) 配列の確定をして(一旦式を入力したら、F2を押して、『ShiftとCtrlを押しながらEnterキー』を押す)、再確定してください。 B2:10 C2:=A2-A1 「holiday」として、名前の定義で登録します。 '------------------------------------------- 2009/1/1 2009/1/12 2009/2/11 2009/3/20 2009/4/29 2009/5/3 2009/5/4 2009/5/5 2009/5/6 2009/7/20 2009/9/21 2009/9/22 2009/9/23 2009/10/12 2009/11/3 2009/11/23
- ever-green
- ベストアンサー率43% (7/16)
祝日を除いて日数をカウントする関数、あるいは祝日を考慮して何日後の日付を導く関数は有りません。何故なら法律が変われば将来の祝日は変わります。また過去年の祝日は分かってはいますが計算では出ません。将来年は現在の法律での祝日とするとしても2年後については自動判定不可能です。何故なら春分の日と秋分の日は来年までしか決まっていないからです。(国立天文台が2月の官報で来年分を発表する) 日数の計算はDATEIF関数を使うより引き算で良いでしょう。上の例で6が表示されると解っているんですから計算式で+1するだけです。
- Cupper
- ベストアンサー率32% (2123/6444)
DATEDIF関数 これで解決しますよ ただし、これは関数ウィザードでは表示されない関数です この関数は =DATEDIF(開始日,終了日,"単位") と指定して使います 単位には、 "年"、"月"、"日"、を指定する、"Y"、"M"、"D"、 を指定します 質問の場合は"日"を指定すればよいので =DATEDIF("2009/7/10","2009/7/22,"D") とすればOK ヘルプもありませんから、解説しているサイトを探してみてください 詳しい情報を入手できますよ
補足
開始日から日祝を除いた7日後から終了日までを求めたいので、この式ではできないみたいです。
補足
7/17から22までは6でした。私の勘違いでした。すみません 7/10から7日後は日と祝を除いて 10・11・13・14・15・16・17 で7日後は17日としていましたが、18日でした。 これも私の勘違いでした。 なので18日から22日までの日数を求めたいです。 18・19・20・21・22なので答えは5です。