- ベストアンサー
Excelの式の作り方について
このたびはお世話になります。 以下のような仕組みを作りたいのですが、方法をご教授下さい。 どうぞよろしくお願いします。 例 (1) あるセルに、2007年9月1日~2008年2月28日の間の、いづれか任意の日付を入れた時、結果欄のセルに、2010年2月28日と表示させる。 (2) 同様にこのセルに、続く2008年3月1日~2008年8月31日の間の、いづれか任意の日付を入れた場合には、結果欄のセルに、2010年8月31日と表示させる。 (3) 同様にこのセルに、続く2008年9月1日~2009年2月28日の間の、いづれか任意の日付を入れた場合には、結果欄のセルに、2011年2月28日と表示させる。 以下繰り返す
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これにぴったりの関数がある。 VLOOKUPのTRUE型です。 長いIF関数式で判別するなどやらなくて済む。 日付で区分けされているので、あるいは質問者は難しく感じたかもしれないが。エクセルでは日付を入れたセルの値は、日付シリアル値という整数であることをご存知かな。例えば2007年9月1日は39326です。1900年1月1日から39326番目の日ということです。 これさえ知っておれば、例えば1-8の時1、9-17の時2、・・を返すという課題と同じなんです。 例データ E,F列に 2007年9月1日 2010年2月28日 2008年3月1日 2010年8月31日 2008年9月1日 2011年2月28日 2009年3月1日 2011年8月31日 2009年9月1日 2012年2月29日 2010年3月1日 2012年8月31日 2010年9月1日 2013年2月28日 を作る。上2行入れて、範囲指定して、+ハンドルを出し、ドラッグ すれば簡単に何行でも作れる。具体的な日にちだから、限度はあるが適当な年月まで作る。 ーー B1に =VLOOKUP(A1,$F$1:$G$10,2,TRUE) と式を入れて、式を下方向に複写する。 A列、B列の書式を日付に設定しておく。 結果 2007年9月23日 2010年2月28日 2007年9月1日 2010年2月28日 2008年2月28日 2010年2月28日 2008年3月1日 2010年8月31日 2008年9月1日 2011年2月28日 2009年3月1日 2011年8月31日 2009年9月1日 2012年2月29日 2010年3月1日 2012年8月31日 2010年9月1日 2013年2月28日 2008年9月2日 2011年2月28日 #N/A #N/Aを出さないようにするには =IF(A1="","",VLOOKUP(・・・)) とする。
その他の回答 (4)
- deecyan
- ベストアンサー率38% (89/233)
A1に日付がはいっているものとして B1に 下記の式をいれて セルの書式を 日付にしてください。 =IF(A1="","",IF(MONTH(A1)<3,DATE(YEAR(A1)+2,3,1)-1,IF(MONTH(A1)<9,DATE(YEAR(A1)+2,9,1)-1,DATE(YEAR(A1)+3,3,1)-1))) 3月未満の日付は その年の2年後の3月1日の前の日 9月未満の日付は その年の2年後の9月1日の前の日 それ以外は その年の3年後の3月1日の前の日 としています
お礼
即座に使用できる数式をお示しくださり、ありがとうございます。 お礼申し上げ、至急使用させていただきます。 まずは御礼申し上げます。
- Cupper
- ベストアンサー率32% (2123/6444)
EOMONTH関数でできそうですね。 EOMONTH関数は起点にした日から前または後の月の【最終日】を求める関数です。 うるう年も考慮されていますので、このほうが便利でしょう。 A1セルに日付け 2007年9月10日が入力されているのであれば =EOMONTH(A1,24+5) で2010年2月28日になります。 この数式の中で使っている "24+5" は2年5ヶ月を意味します。 ("29"より分かり安いと思います) これで気が付いたと思いますが、6ヶ月ごとに繰り返しますからこの5ヶ月の部分を増減させることで目的が達成できそうです。 9月の時 5 10月の時 4 11月の時 3 12月の時 2 1月の時 1 2月の時 0 3月の時 5 (以下同様に続く) TEXT関数で日付けから月だけを抜き出しそれを計算してみましょう TEXT(A1,"m") さらに6ヶ月ごとに数値が繰り返されるので、月の数を6で割った余りを求めます MOD(TEXT(A1,"m"),6) さらにさらにここで必要な数字は 5~0 ですので 5から計算結果を引きます 5-MOD(TEXT(A1,"m"),6) これで 9月の時 2 10月の時 1 11月の時 0 12月の時 5 1月の時 4 2月の時 3 3月の時 2 (以下同様に続く) 3ヶ月ほどずれていますが、概ねOK 余りを求める段階で3か月分の数値を操作します 5-MOD(TEXT(A1,"m")+3,6) これで月に対する必要な数値になりました 初めに示した数式の 24+5 の部分に当てはめると =EOMONTH(A1,24+5-MOD(TEXT(A1,"m")+3,6)) これでOK ※使用している関数の詳細は関数ウィザードまたはヘルプから参照してください。
お礼
詳細はご教示に感謝を申しのべます。 まずは御礼申し上げ、拝読申し上げます。
- maron--5
- ベストアンサー率36% (321/877)
◆2月29日を考慮した式に誤りがありましたので訂正します =IF(A1="","",IF(SUMPRODUCT((TEXT(A1,"mdd")>="301")*(TEXT(A1,"mdd")<"901")),DATE(YEAR(A1)+2,8,31),DATE(YEAR(A1)+2+(MONTH(A1)>=9),3,1)-1)) または、 =IF(A1="","",IF(SUMPRODUCT((MONTH(A1)>2)*(MONTH(A1)<9)),DATE(YEAR(A1)+2,8,31),DATE(YEAR(A1)+2+(MONTH(A1)>=9),3,1)-1)) もう一つ =IF(A1="","",IF(MONTH(EDATE(A1,-2))<7,DATE(YEAR(A1)+2,8,31),DATE(YEAR(A1)+2+(MONTH(A1)>=9),3,1)-1)) ★ただし、EDATE関数は、「アドイン関数」です。メニューバーの[ツール]-[アドイン]を選択して、「分析ツール」にチェックしてから使用してください ★2月29日を考慮する必要がなければ、無視してください
お礼
ご訂正をお知らせくださりありがとうございます。 早速拝読申し上げます。
- maron--5
- ベストアンサー率36% (321/877)
◆一例です =IF(A1="","",IF(SUMPRODUCT((TEXT(A1,"mdd")>"228")*(TEXT(A1,"mdd")<"901")),DATE(YEAR(A1)+2,8,31),DATE(YEAR(A1)+2+(MONTH(A1)>=9),2,28))) ★上の式ですと 2008/2/29 の場合 2010/8/31 になります ◆2月29日を考慮した方法です =IF(A1="","",IF(SUMPRODUCT((TEXT(A1,"mdd")>="301")*(TEXT(A1,"mdd")<"901")),DATE(YEAR(A1),8,31),DATE(YEAR(A1)+(MONTH(A1)>=9),3,1)-1))
お礼
早速ありがとうございます。 あまりの早さに恐れ入っております。 まずは御礼申し上げます。
お礼
仰せのとおり何かありますと、すぐにIF関数を使用してまいりました。 (確か7段までしか式にできなかったと思います) たいへん有難い願ってもないご指摘で、早速ご教示を当てはめます所存です。 まずは御礼申し上げます。