『○日後の日付と○ヶ月後の日付を一つの式で表示』(雨鹿) 以前、「超初心者」としてこちらで土日祝日ならその翌日となる日付計算の仕方を教えていただきました。 その節はどうもありがとうございます。   今回は、そこで使っている計算元の日付の式について変更したい事が出来ました。 現在は、計算を始める日付(月末の日付)に各会社毎に決められた期間 (例:120日後)を VLOOKUP で抜き出してきて、足して出た日付を使っています。   この式を120日など3の倍数になる期間ならその月の月末、70日や110日などなら 最寄りの10,20,30日といったキリの良い日付にずらす事は、一つの式で出来るのでしょうか?   よろしくご教授のほど、お願い致します。 ---- =IF(MOD(VLOOKUP(…),120)=0,月末の式,最寄の締め日) のように、IF関数で分けてはいかがですか? ハンドルネームも変えられているようですし、 以前の状況も分かりませんので、式やレイアウトを含めご提示願います (Ohagi) ---- (Ohagi)様、返信有難うございます。 以前の質問と、教えていただいた式(マクロ)はここにあります。 [[20070515124946]]「日付を自動で訂正したい」 初心者なので、何がどうなっているのかイマイチ解っておりません。 Ohagi様からのヒントを何処に使えばいいのかも解っておりません。 宜しくお願い致します。 (雨鹿) ---- >教えていただいた式(マクロ) 「関数(式)」と「マクロ」を一緒にしない方が良いと思いますよ?  zurasuday(日付'',''日数'',''祝日テーブル)  → Zurasuday(I38'',''VLOOKUP($S4,Sheet1!$A$2:$R$22,18,FALSE)'',''………)  必要な要素ごとに、「'',''」で区切ります。関数は「''()''」で区切ります。 「zurasuday(………)」で「○日後の日付け(土日祝日含まず)」求めているのですよね? 「計算を始める日付」から「zurasuday(………)」までの日数 → DATEDIF(計算を始める日付,zurasuday(………),"D") これが「120」で割り切れるか? → MOD(DATEDIF(………),120)の答えが「0」  ↑が、「論理式」にあたります。「IF(''論理式'',真の場合,偽の場合)」 (Ohagi) ※リンクは「半角スペース」をいれずに、「[[ ]]」でくくると出来ますよ ---- 返信有難うございます。 ええと、私の頭がお馬鹿なので、よく分からないのですが、 >「計算を始める日付」から「zurasuday(………)」までの日数 → DATEDIF(計算を始める日付,zurasuday(………),"D") >これが「120」で割り切れるか? この文章の中の「zurasuday(………)」と言うのは、すでに土日祝日をずらした計算結果の事なのでしょうか? そして  >これが「120」で割り切れるか? と言うのは、計算する前の「A社の期日は120日」の事を聞いているのではなく、ずらした日付という事で良いでしょうか? あともう一つ、「偽の場合」のずらしたいキリの良い日付はどのように入力すれば良いのでしょうか? お馬鹿な質問の数々で、申し訳有りませんがよろしくお願いします。 ---- >すでに土日祝日をずらした計算結果の事なのでしょうか? それが、一番良くわかっていないといけないのは 雨鹿さんご自身ではないでしょうか? 前回のご質問からの数式ですので、何を出したのか分かりませんか? >計算する前の「A社の期日は120日」の事を聞いているという事で良いでしょうか ↓の条件をあてはめるために、出した日付けからの日数を計算しなくて良いのでしょうか? >120日など3の倍数になる期間ならその月の月末  →(真の場合) >70日や110日などなら最寄りの10,20,30日 →(偽の場合) 今後、式の変更があることを想定して一つずつ理解していくことをお勧めします (Ohagi) ---- お返事有難うございます。 すみません、質問の内容が無茶苦茶でした。 >すでに土日祝日をずらした計算結果の事なのでしょうか? それが、一番良くわかっていないといけないのは 雨鹿さんご自身ではないでしょうか? 前回のご質問からの数式ですので、何を出したのか分かりませんか? ↑これは、その次の、 >↓の条件をあてはめるために、出した日付けからの日数を計算しなくて良いのでしょうか? >120日など3の倍数になる期間ならその月の月末  →(真の場合) >70日や110日などなら最寄りの10,20,30日 →(偽の場合) の部分が解らないので、出た発言です。 どういう事がしたいのか、私の頭の整理の為にもう一度説明させていただきます。 例 A社に対するの6月分の請求の振込期限は、120日後。 B社に対しては、110日後。 計算すると、現在出てくる状態では、A社は平成19年10月29日(月)、B社は同10月18日(木)。 これを、A社は10月31日(水)←月末     B社は最寄りの20日が土曜日なので、翌週の22日(月)←最寄りのキリの良い日 に出来るようにしたい……なぁ、と言う事なのですが。 書いていて、不可能な気がしてきました……。                     (雨鹿) ---- 追伸 今まで、「3の倍数」と言う言い方をして来ましたが、「○ヶ月間」と置き換えられる日数と言うことです。 つまり、「30日」の倍数の事です。 そして、その書き方で行くと、「○ヶ月+α日」になる(または「2.3ヶ月」でもいいです)日付が、EDATE や EOMONTH で考え付かなかった為、そのまま以前作ってもらった物を、流用できないかと考えた次第です。 よろしくおねがいします。   (雨鹿) ---- [A] [B] [C] [D] [E] [1] 起算日 取引先 猶予日数 振込期限日1 振込期限日2 [2] 平成19年7月1日 A社 120 平成19年10月29日 平成19年10月31日 [3] 平成19年6月30日 B社 110 平成19年10月18日 平成19年10月20日 E列の値が欲しいのですよね? 日付けの計算は苦手ですし、ご質問の内容を理解できていないと思いますので自信ないですが… E2 → =IF(MOD(C2,30)=0,DATE(YEAR(D2),MONTH(D2)+1,0),DATE(YEAR(D2),MONTH(D2),CHOOSE(ROUNDUP(DAY(D2)/10,0),10,20,30,10)))              ----------------------------                  真の場合                      偽の場合 のような感じでは、いかがでしょうか? (Ohagi) ---- Ohagi様、お返事有難うございます。 申し訳ありませんが、このE2の計算結果をD2にあたるセルに表示する事は、可能でしょうか? 実は、この計算結果を使った文書を(シート2に)作成していて、そのままそのページを印刷して各社に出そうとしています。 不可能でしたら、そこは計算結果だけどこか別のところに表示させて、手入力しますが……。 出来ましたら、宜しくお願い致します。 (雨鹿) ---- 昨日は、回答していただきどうもありがとうございます。 引き続きまして、ご質問させていただきたく本日も伺わせて頂きました。 昨日、例として出した物を、もう少し正確に記述したいと思います。 >例 >A社に対するの6月分の請求の振込期限は、120日後。 >B社に対しては、110日後。 >計算すると、現在出てくる状態では、A社は平成19年10月29日(月)、B社は同10月18日(木)。 >これを、A社は10月31日(水)←月末 >    B社は最寄りの20日が土曜日なので、翌週の22日(月)←最寄りのキリの良い日 >に出来るようにしたい……なぁ、と言う事なのですが。 補足させて頂くと、 ・計算の起算日は、すべて支払対象月の末日です。 ・A社は「期日」が120日(=4ヶ月後)なので、末日締めという事で「月末」に。 ・B社は「期日」が110日(=3ヶ月と20日)なので、キリのいい日付(10・20・月末)に。 ・それぞれ、計算した結果が土日祝日ならば、その次に来る平日へずらしたい。 以上の事が一度で出来れば、言う事無しなのですが………。       ↑ (「一度」と言うのは、元になるデータを変えるとA社もB社も両方の場合を、一つの式で表示できるような状態にしたい…という事です。) 「手入力は減らしたい」や、「計算結果が幾つも別の所にあると解り辛い」と言う要望があるので、なるべくなら計算結果が一度で表示できるようにしたいのです。 皆様、ご教授のほど宜しくお願いします。 ---- >このE2の計算結果をD2にあたるセルに表示する事は、可能でしょうか? 可能でしょう 印刷範囲外に、D2の値を移動したり、印刷する際に非表示にしたり(ビューの登録など)と工夫すれば良いと思います 折角、作成してくれたマクロを無駄にすることにもなりますし、計算式で全てをまかなうのは大変でしょう (計算式での対応が大変だから、前回の回答でマクロが提示されたのだと思いますが…) 厳しい言い方ですが、(ご質問の書き方から、単なる作成依頼のように感じる部分があるので…) 「一度で出来る」、「計算結果が幾つも別の所にあると解り辛い」  →計算式が複雑になる、途中経過が分からないので間違いが見つけづらい、自分で修正が出来ない…   自分の力量と作業リスクを比べて取捨選択するよう良く、考えてみて下さい  >昨日、例として出した物を、もう少し正確に記述したいと思います 最初から、正確に記述して下さい でなければ、ご自分で編集・修正しないといけません 回答者の回答が無駄になる可能性もありますよね? (Ohagi) ---- Ohagi様、お返事有難うございます。 >自分の力量と作業リスクを比べて取捨選択するよう良く、考えてみて下さい はい、教えて頂いた式を使って、もう一度良く考えて見ます。 一つでまとめようとせずに、別の所に結果を分けて、 そこからまた次の式……という方法が、一番無難そうかつ、説明がし易そうなので、頑張ってみます。 >最初から、正確に記述して下さい >でなければ、ご自分で編集・修正しないといけません >回答者の回答が無駄になる可能性もありますよね? 申し訳ありません。仰るとおりです。 今後は、ちゃんと自分の中で質問内容など、整理してからお伺いしたいと思います。 ご迷惑をお掛けしました。 ---- 度々申し訳ありません。 先ほど教えて頂いた式を使って、二段階に分けてみました。 一段目 D2=zurasuday(………)は、印刷範囲の外に設定してあります。 二段目 E2=IF(MOD(C2,30)=0,DATE(YEAR(D2),MONTH………)) を印刷したい部分に入れて見ました。 そうしましたら、E2に月末かキリのいい日が出てくるようになりました。 ですが、またここで土日祝日になってしまいました。 このE2=IF(………)にもzurasudayを組み合わせる事は出来るのでしょうか? それとも、最初に設定した一段目から変えれば、上手くいくのでしょうか? 宜しくご教授のほど、お願い致します。   (雨鹿) ---- 似たような質問ですので、↓を参考にしてみて下さい [[20050118111317]]『土日祝日以外の当月末』(なな) 前回頂いた回答を再度読んでみて下さい 「zurasuday」は、ユーザー定義関数です マクロが登録されていなければ、計算されません =zurasuday(日付,日数,祝日テーブル) と言う形にしてあれば、計算できるように マクロを組んでいただいていませんか? (Ohagi) ---- Ohagi様、お返事有難うございます。 >=zurasuday(日付,日数,祝日テーブル) >と言う形にしてあれば、計算できるように >マクロを組んでいただいていませんか? はい、多分そうだと思います。 と言う事は、zurasudayは使えないと言うことでしょうか? 何故、そう思うのかと言いますと、 いただいたマクロは、(日付,日数,祝日テーブル)の3条件で機能するように出来ているんですよね? そしてこのマクロは、 ・支払対象月の末日(=「日付」)からある期間(=「日数」)を「日付」に足す ・足された結果が土日祝日ならば、平日になるまで日数を足していく と言うものだと私は考えています。 そうすると、「日付」の部分にE2の日付を入れても、マクロが働く条件の一つである 「日数」の部分が、無い状態になってしまいますよね? ということは、zurasudayはこのE2の式には組合わせられないと言う事になりますよね? ………初心者の脳みそは、煮えてしまいそうです。 あと一つ、教えて頂いた『土日以外の当月末』の内容についてお聞きしたいと思います。 この質問では、月末が土日の場合、日にちを前にずらしていますが、 私の場合は、後ろ(翌月)にずらします。 単純に、「−1」となっている辺りを「+」にしてしまっても良いのでしょうか? お手数ですが宜しくお願い致します。   (雨鹿) ---- 追伸 今、教えて頂いた『土日以外の当月末』の内容を自分なりにやって見た結果 やはり単純に「+1」で良いみたいです。 初歩的な事をお聞きしてしまい、申し訳ありません。 そこをいじっているときに、思い出したのですが、 この式は月末を求める式なので 「キリのいい日」の方には使えないんじゃないでしょうか? それとも、これらを一つの式で表示する事が出来るのでしょうか? 宜しくご指導のほどお願いします。   (雨鹿) ---- >この式は月末を求める式なので どの式のことを仰っているのでしょうか? >そこをいじっているときに 何をどのようにいじったのでしょうか? 私から画面は見えませんので、全く分かりません 前に回答したように 「''IF(論理式,真の場合,偽の場合)''」 E2 → =IF(MOD(C2,30)=0,DATE(YEAR(D2),MONTH(D2)+1,0),DATE(YEAR(D2),MONTH(D2),CHOOSE(ROUNDUP(DAY(D2)/10,0),10,20,30,10)))              ----------------------------                  真の場合                      偽の場合 と、ご提示しましたよね? 「真の場合だけの数式」「偽の場合だけの数式」を入力して、結果がどのようになるか 確認してみて下さい >zurasudayはこのE2の式には組合わせられないと言う事になりますよね? 結局、最初のご質問内容からドンドン変って、ずれが生じているからではないですか? 『指定日数経過した「末日」or「10、20、30日」を出したい  但し、土日祝日だった場合は「翌営業日」とする』 ↑が、雨鹿さんがなさりたいことですか? (Ohagi) ---- お返事有難うございます。 すみません、何度も頭の悪い発言を繰り返しておりますが色々と 基本的な事を知らないので、上手く説明できないことが多いです。 Ohagi様が聞きたいことが、今一つ理解できていないようなので、 今から書く事もまた、見当外れかもしれませんが、ご容赦ください。 >この式は月末を求める式なので どの式のことを仰っているのでしょうか? >そこをいじっているときに 何をどのようにいじったのでしょうか? 私から画面は見えませんので、全く分かりません これは、教えて頂いた『土日以外の当月末』の中の式 =WORKDAY(DATE(YEAR(A1),MONTH(A1)+1,1),-1,祝日) を自分なりに解釈しようとしていたのです。 それで、出てくる計算結果が「+1」で翌月になる事を自分のほうのデータ でも確認したのですが、そこでふと思ったんです。 「でも教えてもらったこの式=WORKDAY(DATE(YEAR(A1),MONTH(A1)+1,1),-1,祝日) は月末を求める式なのでは?」 「と言うことは、キリのいい日にちの方には、使えるのか?」 そこで上記の発言が出てまいりました。 >zurasudayはこのE2の式には組合わせられないと言う事になりますよね? 結局、最初のご質問内容からドンドン変って、ずれが生じているからではないですか? 『指定日数経過した「末日」or「10、20、30日」を出したい  但し、土日祝日だった場合は「翌営業日」とする』 ↑が、雨鹿さんがなさりたいことですか? はい、その通りです。 途中までは、ただ「期日」分の日数が経過した日にちを出せばよかったのですが、 「やっぱり、末日とかキリのいい日にしたい。」と言う事になってしまったのです。 その結果、皆様に多大な迷惑をお掛けしてしまう事となりました。 やはり、これはもう最初から別の式を考えたほうが良いのでしょうか? 最後に、また初歩的な事で申し訳ないのですが教えてください。 >「真の場合だけの数式」「偽の場合だけの数式」を入力して、結果がどのようになるか >確認してみて下さい これは、教えて頂いたIFの式の「真の場合」だけ上記の通り入力して残して、 「偽の場合」の部分を例えば「0」とかにすればよろしい、のでしょうか? 申し訳ありません、「だけの数式」の意味とやり方がわかりませんでした。 以上、宜しくお願いします。   (雨鹿) ---- すみません、追加事項がありました。 「キリのいい日」は10日と20日の場合はそのままで、 30日の場合は「月末」として、処理したいです。 七面倒臭くて、申し訳有りませんが宜しくお願いします。    (雨鹿) ---- よぉ〜く見て下さいっ!! 「IF(論理式,真の場合,偽の場合)」 倫理式で判断した結果、「真の場合」と「偽の場合」に分けて計算させているのですよ? =DATE(YEAR(D2),MONTH(D2)+1,0) =DATE(YEAR(D2),MONTH(D2),CHOOSE(ROUNDUP(DAY(D2)/10,0),10,20,30,10)) >皆様に多大な迷惑をお掛けしてしまう事となりました ここには、一人しか居ませんけど…(^_^;) 他の回答が付かないのは、質問内容が回答者に伝わらない等々の問題があるのではないでしょうか? > 30日の場合は「月末」として、処理したいです では、最初に質問された「120日後」など30日で割り切れる(月単位で計算できる)ものは 「末日」でという判断はいるのでしょうか? 単純に、指定日数経過後の「最寄の10、20、末日(但し土日祝日なら翌営業日)」となりませんか? 「指定日数」が「10で割り切れる数値」なら =IF(MOD(C2,30)=0,WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,0),0,祝日),WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,DAY(MOD(C2,30))),0,祝日)) で、いけそうですが…いかがですか? 祝日リストに「祝日」と名前を定義してあれば出来ると思います (Ohagi) ---- ………ぜんぜん解りません………。 自分の理解力の無さに、自分で呆れてしまいます。 もう少しだけ、物解りが絶望的に悪い生徒で申し訳ありませんが教えてください。 もう全然解らないので、今自分がどうなっているのか、ここに丸ごと乗せます。 U40=Zurasuday(I44,VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE),Sheet1!D34:D59)   U40は、印刷範囲外に計算結果を仮置きしているセルです。 今、このU40を元に U42=IF(MOD(VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE),30)=0,DATE(YEAR(U40),MONTH(U40)+1,0),DATE(YEAR(U40),MONTH(U40),CHOOSE(ROUNDUP(DAY(U40)/10,0),10,20,30,10))) をこれまた、印刷範囲外(U42)に置いてみました。 ここに○社(期日:120日)の6月分(起算日:5月31日)を入力すると・・・・・・ U42に表示される結果が、「平成19年9月30日(日)」になります。 そこで、教えて頂いたWORKDAYを使って、 I40=WORKDAY(DATE(YEAR(U42),MONTH(U42)+1,1),0,Sheet1!D34:E59)   I40は、印刷範囲内です。 とすると、 表示されている結果は、「平成19年10月1日(月)」になります。 ここまでは何とか解りました。 しかしここに、期日=110日の□社を入れると、やっぱり「平成19年10月1日(月)」になります。 (U40の結果が9月18日、そこから導かれたU42が9月20日。だからI40=10月1日。) 自分がおかしい事は、解っているのですが、何処に何をしたら良いのかがよく解りません。 I40に、WORKDAYを設置するのが間違っているんでしょうか? 宜しくお願いします。    (雨鹿) アワワ、書いてるうちに、先にお返事が来てしまいました。 エーと、今から戻ってやってみますが、上記の内容で「なんかオカシイ」と思う所がありましたら ご指導のほど宜しくお願いします。    (雨鹿) ---- やっぱり、解りません・・・・・・・・・。 上記のohagi様のIF式は、私が丸乗せした式の、U42に入る式の事ですよね? やってみたら、結果が12月になっちゃいました・・・・・・・・・。 もちろん連動してI40は「20年1月1日」・・・・・・・・・ってアレ? 私、祝日の表に「2008年1月1日」も入力してあるんですが、何故? ますます、泥沼に・・・ また小さな疑問を一つ。 >祝日リストに「祝日」と名前を定義してあれば出来ると思います この祝日リストと言うのは、シート1にずらずらとお休みの日を書いて一番上のところには 「祝日」と入力してある(Sheet1!D34:D59)この状態でも良いんでしょうか? 後、上で丸乗せした式の中に間違いを見つけたので直しました。    (雨鹿) ---- あなたのレイアウトが提示されていないので、全く分かりません ですから、以前私が提示したレイアウトで提示しています A2→日付 C2→日数 祝日→祝日一覧表の「名前」 =IF(MOD(C2,30)=0,WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,0),0,祝日),WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,DAY(MOD(C2,30))),0,祝日)) >「祝日」と入力してある(Sheet1!D34:D59)この状態でも良いんでしょうか? 祝日の判断をする為に作成したものですよね? それに、「挿入→名前→定義」で名前を付けて下さい (Ohagi) ---- お返事有難うございます。 やはり、何かが間違っているのか、上手くいきません。 今度は何故か、「8月20日」と出てきました。 どこかが抜けているのでしょうか? C2=VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE) A2=I44 と言う風になっております。そのまま置き換えたつもりなのですが・・・・・・ =IF(MOD(VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE),30)=0,WORKDAY(DATE(YEAR(I44),MONTH(I44)+VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE)/30,0),0,祝日),WORKDAY(DATE(YEAR(I44),MONTH(I44)+VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE)/30,DAY(MOD(VLOOKUP($T4,Sheet1!$B$3:$T$29,18,FALSE),30))),0,祝日)) 祝日はこれだけ入力してあります。 2007年4月30日 2007年5月3日 2007年5月4日 2007年5月5日 2007年7月16日 2007年9月17日 2007年9月23日 2007年9月24日 2007年10月8日 2007年11月3日 2007年11月23日 2007年12月23日 2007年12月24日 2007年12月31日 2008年1月1日 2008年1月2日 2008年1月3日 2008年1月7日 2008年2月11日 2008年3月20日 2008年4月29日 2008年5月3日 2008年5月4日 2008年5月5日 2008年5月6日 2008年7月21日           (雨鹿) ---- >計算の起算日は、すべて支払対象月の末日です >6月分(起算日:5月31日) 「6月分」が支払対象月なら、「6月30日」じゃ無いんですか? どこに何が入っていて、どの値がどのような結果が得られたらいいのか 条件は何なのか、今一度整理して下さい 仰っていることが、''サッパリ''分かりません ↓のようにしていただければ分かり易いです Excelからコピーペーストして下さい [A] [B] [C] [D] [E] [1] 起算日 取引先 猶予日数 振込期限日1 振込期限日2 [2] 平成19年7月1日 A社 120 平成19年10月29日 平成19年10月31日 [3] 平成19年6月30日 B社 110 平成19年10月18日 平成19年10月20日 >そのまま置き換えたつもりなのですが・ 先にも回答したように、一度にすべて確認するのではなく 「真の場合だけの数式」「偽の場合だけの数式」を入力して、結果がどのようになるか 確認して下さい 私が提示した「=IF(MOD(C2,30)=0,WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,0),0,祝日),WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,DAY(MOD(C2,30))),0,祝日))」 では、「起算日:2008/5/31」「120日」=「2008/8/31」    「起算日:2008/6/1」 「130日」=「2008/10/10」 となりますけど? (Ohagi) ---- お返事有難うございます。 すみません、まだ色々と説明不足でした。 >「6月分」が支払対象月なら、「6月30日」じゃ無いんですか? すみません、これは私のミスです。 「6月に発送する5月締めの支払対象の起算日は5月31日」 と言う事だったので、ohagi様には解らないことを書いてしまいました。 >↓のようにしていただければ分かり易いです >Excelからコピーペーストして下さい エーと・・・すみません。 今、計算結果を表示する所が、このような表の形になっていないので どうやって説明すればよく分からないのですが・・・ 取りあえず、計算の元となるモノはこのような配置になっています。 しーと1   B      C    D   E     F     G〜R           S  2 会社コード  〒   住所  会社名  担当者名  4月〜翌3月       期日 3 ○○○   000-0000 ・・・・・・ ○×社  △△   (各月の金額が入ります) 120 4 ×××             △×社                     70 5 ○×△             ×□社                     110 ・  ・               ・                      ・ ・  ・               ・                      ・ ・  ・               ・                      ・ この表を元にして、シート2に○月締切分の請求金額、その締切日を記入した文書を作成してあります。 今までの計算に必要と言われた、祝日のテーブルはシート1の開いてるスペースに作って有ります。(Sheet1!D34:D59) 計算の大本の表は、全部で27社分作ってあります。今後多少増減すると思われますが、計算に影響するほどはないと思います。(三万件とか・・・) >「起算日:2008/5/31」「120日」=「2008/8/31」となりますけど? あの、単純に5月31日に120日足すと9月18日になりませんか? もしかして、そこからしてすでに私、おかしいですか?   (雨鹿) ohagi様、今日一日色々とご教授下さって有難うございました。 申し訳ありませんが、私、これを会社のパソコンからしているので 本日は時間切れとなってしまいました。 ご返信に対するお返しが、月曜となってしまいますが、平にご容赦ください。 それでは宜しくお願い致します。   (雨鹿) ---- >あの、単純に5月31日に120日足すと9月18日になりませんか? 起算日の月を入れて計算していたので A2→日付 C2→日数 祝日→祝日一覧表の「名前」 =IF(MOD(C2,30)=0,WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30+1,0),0,祝日),WORKDAY(DATE(YEAR(A2),MONTH(A2)+C2/30,DAY(MOD(C2,30))),0,祝日)) ではいかがですか? 提示されたレイアウトでは、使用する内容が明示されている箇所が「期日」しかない 肝心の起算日はどこですか? 計算に利用する表のレイアウトを提示しないと、全く参考になりませんよ!!(>_<) (Ohagi) ---- Ohagiさんが確認されたことのほぼ焼き直しですが、なさりたいことは 『指定日数経過した「10、20、末日」を出したい  但し、土日祝日だった場合は「翌営業日」とする』 と言うことで宜しいのですよね? そして、 >単純に5月31日に120日足す で宜しいのですよね? つまり以下の小さなサンプルですと(日付は2007年の物です) [A] [B] [C] [1] 起算日 期間 支払日 [2] 4月1日 10 4月23日 [3] [4] [5] 祝日 [6] 4月20日 参考 4月20日 金 4月21日 土 4月22日 日 4月23日 月 起算日より10日後は    4月11日(水) キリの良い日付にずらして 4月20日(金) 祝日なので        4月21日(土) 土日もずらして      4月23日(月) C2に入れてある数式は =WORKDAY(DATE(YEAR(A2+B2),MONTH(A2+B2)+(DAY(A2+B2)>20),LOOKUP(DAY(A2+B2),{0,9;11,19;21,-1})),1,A6) です。 まずは、サンプルと同じ表を作って (祝日リストは当然の物をご用意下さい。 参照範囲の変更もお願いします。) A2とB2の値をいろいろ変えて正しい結果が出るか確認してみて下さい。 現在のシート構成にあわせて式を変更するのは、それからです。 思った結果にならない場合は 起算日と期間、希望する日付の3つを教えて下さい。   ★追記1 >思った結果にならない場合は 祝日リストの参照範囲を変更した式も教えて下さい。   ★追記2 確認の際はどこか空いたセルに単純に期間分足した日付と その曜日を表示させておくと分かりやすいかもしれません。 (祝日リストも然り。) 例えば、B3に+期間の日数を表示させるなら =A2+B2 C3にでも、 =TEXT(B3,"aaa") で曜日が出ます。 C3セルをコピーして、B6以降にも貼り付けて下さい。 (HANA) ---- 上で呈示した式を確認していただく時に、丁度良い(悪い?) 日付で確認してもらえたら、おそらく >>単純に5月31日に120日足す >で宜しいのですよね? この部分の考えが違って、求める日付が求まらないかもしれません。 例えば、起算日:1月末日・期日:30 の場合 単純に足し算すると  起算日より30日後は    3月2日(金)  キリの良い日付にずらして 3月10日(土)  土日をずらして      3月12日(月) と言う日付になります。 それで良ければ上の式をどうぞ。 そうではなく 「期日は30日を1ヶ月として計算して、  1月末日から30日(1ヶ月)後は、2月末日  ただし、土日祝日だった場合 平日まで動かす。」 と言う求め方をするならC2の式は =WORKDAY(DATE(YEAR(A2),MONTH(A2)+INT(B2/30),DAY(DATE(YEAR(A2),MONTH(A2)+INT(B2/30)+1,0))+MOD(B2,30)-1),1,A6) こちらで宜しいかと思います。 ただし、起算日に末日以外を指定した場合でも、起算日は 当年当月の末日 として計算されます。 (正しくは、「年月情報しか見てないよ」ですが。) 末日以外を起算日としたい場合は、他の式を作る必要がありそうです。 また、この式は「キリの良い日にずらして」と言う操作を行って居ません。 ですから、期日は30で割ったときに、余りが 0,10,20 いずれかになるように 入力されている必要があります。 期日が他のパターンですと、キリの良い日にシフトされません。 以上2点をご理解して頂いた後、本当に求める日付が計算されるのか 数式の検証をお願いします。 (HANA) ---- おはようございます。 Ohagi様、HANA様、お返事ありがとうございました。 すみません、最初にお詫びと訂正を。 >あの、単純に5月31日に120日足すと9月18日になりませんか? ↑これ、110日を足したものですね・・・・・・すみません間違えました。120日なら28日です。 >起算日の月を入れて計算していたので Ohagi様、またまた説明不足で申し訳ありませんでした。 単純に月末に期日を足す計算なので、ほとんど翌月からの計算と違いありません。 起算日のリストは、同じくシート1に発効月をコード番号代わりにしたリスト   B    C 33 対象月 対象日 34 4  2007年3月31日 35 5  2007年4月30日 ・ 6  2007年5月31日 ・ 7  2007年6月30日 ・ 8  2007年7月31日 ・ 9  2007年8月31日   10  2007年9月30日   11  2007年10月31日   12  2007年11月30日   1  2007年12月31日   2  2008年1月31日   3  2008年2月29日   (B33:C45) として作ってあります。 この月のコード番号を使って、VLOOKUPでシート2の印刷範囲内(I44)に「○月分締切日」として日付を表示しています。 この日付(I44)を元に、更に会社コードを使ったVLOOKUPで期日を持ってきて計算をしています。 あと、いただいた、新しい方の式を試してみたのですが、やっぱり8月になります。 変更点は、一つ目のWORKDAY関数の月の計算の所で「+1」しているところですよね? 他に何か、見落としているのでしょうか? HANA様、お返事ありがとうございました。 いただいた一つ目のWORKDAY関数で、端から全部試してみました。 (期日・起算日 共に) 結果、いい感じみたいです。期日は、すべて10で割り切れる数なので、大丈夫だったみたいです。 あり難く頂戴致したいと思います。 物分りの大変悪い生徒で、申し訳ありませんでした。 今後は、もっと勉強して出直してまいります。 長い間、本当にありがとうございました。   (雨鹿) ---- えっと・・・二つの式の違いはご理解いただけていますか? 「端から全部試したサンプルが、たまたま悪い条件でなかった」 と言うだけかもしれません。 考え方を整理した上で、より良い方をお使い下さい。 一番目の式を使うにあたり、注意事項を書いておきます。 一番目の式は日付まで見ています。  起算日のセルには、必ず月末日を入力してください。 こちらは、日数を足した後、切りの良い日付までシフトさせます。  期日を30で割ったときのあまりが 0,10,20 以外でもかまいません。 くどいようですが、月の日数は関係なく単純に期日を足しているものです。 もう一度別のサンプルを載せておきますが 条件によっては以下のような違いが出てきます。  起算日:2005/1/31  期 日:90日  1の式 2005/5/10    2005/1/31 + 90 = 2005/5/1 → 2005/5/10  2の式 2005/5/2    2005/1/31 + 3ヶ月 = 2005/4/30(土) → 2005/5/2(月) 翌営業日まで待たされるのは我慢するとしても(2の式) 2月は日数が少なかったから10日払いになります(1の式) ・・・と言うことで宜しいのですかね? (HANA) 追記・訂正しました。 ---- HANA様、再度のご教授どうもありがとうございます。 すみません、またやってしまいました。説明不足。 起算日は、雨が降ろうと槍が降ろうと、恐怖の大王が降って来ようとも、末日です。 なので、一つ目の式で十分大丈夫だ、と判断しました。 ですがご指摘どおり、違いを理解していなかったので、解説大変参考になりました。 >翌営業日まで待たされるのは我慢するとしても(2の式) >2月は日数が少なかったから10日払いになります(1の式) >・・・と言うことで宜しいのですかね? 私にはよく解らないのですが……何故ずらすのか? と聞いたところ、 「こういうのって、そういうもんなんだよ。」 と、言われました。 お金の話をする時は、 「キリのいい日にずらす」と言う、暗黙の了解があるらしいのです。 大人の世界はいろんな約束事で一杯です。           (雨鹿) ---- 2番目の式は「ずらして」いませんが、期日を30で割ったあまりが 0,10,20 いずれかであれば、必ず切りの良い日付になるように出来ています。 「期日で30って言ったら1ヶ月でしょ」と言う大人の世界の約束事が適用されるなら やはり、2番目の式を使うのが妥当だと思いますよ。 どちらを使っていただいても良いのですが、 実際の表に当てはまるように数式の変更は出来ましたかね? また、老婆心ながら >今、計算結果を表示する所が、このような表の形になっていないので >どうやって説明すればよく分からないのですが・・・ こちらが「どのような表の形」になっているのか気になります。 どうせなら、(現在の様に対象日用の別表を作らず) 対象月を「しーと1」のT1に入力したら T2に前の月の最終日を表示し、起算日のセルを$T$2とした式で U列にでも一度各社毎の計算を行い、印刷用フォームに参照させる と言う方法をとると、いろいろな所に重要な計算式が点在したり 不必要な表を減らしたり 出来ると思います。 もし宜しければご検討下さい。 (HANA) ---- もう見ておられないかと思いますが どうしても気になるので書いておきます。 >私にはよく解らないのですが……何故ずらすのか? と聞いたところ、 >「こういうのって、そういうもんなんだよ。」 >と、言われました。 やはり「そういうもの」なのだとは思いますが、 「30と言う数字で1ヶ月を表す」のも「そういうもの」なのだと思います。 あなたがどちらの式が良いのかを判断するのではなく、 上司の方にどちらの結果になるのがよいのか判断を仰いでください。 (その結果1の式を使うと言う結論であれば、作った甲斐があったと言うものです。  取引先には恨まれそうですが・・。) (HANA)