- ベストアンサー
日付関数を教えてください。
エクセルで、 セルA1に月の締め日を、セルB1に採用日を入力した場合に、 セルC1に最初にくる締め日の初日を表示する関数を教えてください。 なお、月の締め日の入力には、数字の他に「月末」という表現をする場合がありますが出来るでしょうか。 例 セル A1(締め日)が 10日で、B1(採用日)が 5月16日の場合 セル C1(最初に来る締め日の翌日)は 6月11日 となります。 よろしく、お願いいたします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
月末の場合は、翌月1日でいいのでしょうか? C1=DATE(YEAR(B1),MONTH(B1)+IF(A1="月末",1,DAY(B1)>A1),IF(A1="月末",1,A1+1)) または C1=IF(A1="月末",DATE(YEAR(B1),MONTH(B1)+1,1),DATE(YEAR(B1),MONTH(B1)+(DAY(B1)>A1),A1+1))
その他の回答 (10)
- chie65536
- ベストアンサー率41% (2512/6032)
追記。 29 5月31日 30 5月31日 31 5月31日 28 2月16日 29 2月16日 30 2月16日 31 2月16日 月末 2月16日 の結果が 29 5月31日 6月30日 30 5月31日 7月1日 31 5月31日 6月1日 28 2月16日 3月1日(閏年のみ、2月29日) 29 2月16日 3月1日 30 2月16日 3月1日 31 2月16日 3月1日 月末 2月16日 3月1日 となるのは、当方の回答のみのようです。 他の方の回答では 28 2月16日 2月29日(3月1日) 29 2月16日 3月1日(3月2日) 30 2月16日 3月2日(3月3日) 31 2月16日 3月3日(3月4日)※括弧内は、閏年ではない年の場合 となるようで、2月の処理に失敗しています。
- ore-summer
- ベストアンサー率29% (133/454)
#6です。 締日の翌日でしたね。すみません。 =IF(OR(DATE(YEAR(B1),MONTH(B1),A1)>=B1,A1="月末"),DATE(YEAR(B1),MONTH(B1),A1+1),DATE(YEAR(B1),MONTH(B1)+1,A1+1)) C1の書式は日付にして下さい。
- chie65536
- ベストアンサー率41% (2512/6032)
他の回答だと「採用日が2月で、締め日が28日以降」だと「閏年じゃないのに2月29日」や「2月30日」など、有り得ない日付を作ろうとして「#VALUE」が表示される。 また、月の大小もあるので「締め日が30日」の時は「5月採用なら5月31日」「6月採用なら7月1日」を「最初に来る締め日の翌日」にしなければならない。 このように「閏年も考え、月の大小も考えて、すべてのパターンで正しく動く」ようにすると =TEXT(IF(ISERR(DATEVALUE(TEXT(B1,"yyyy/mm/")&LEFT(A1,FIND("日",A1&"日")-1))),EDATE(DATEVALUE(TEXT(B1,"yyyy/mm")&"/01"),1),EDATE(DATEVALUE(TEXT(B1,"yyyy/mm/")&LEFT(A1,FIND("日",A1&"日")-1)),(VALUE(TEXT(B1,"d"))>VALUE(LEFT(A1,FIND("日",A1&"日")-1)))*1)+1),"m月d日") と言う式になる。
エクセルは操作したこともない門外漢ですので大よその書き方のアイデアだけ・・・。 10___2008/5/16__2008/6/11 <-- 最初の締日 2008/6/10 の翌日 16___2008/5/16__2008/5/17 <-- 最初の締日 2008/5/16 の翌日 17___2008/5/16__2008/5/18 <-- 最初の締日 2008/5/17 の翌日 末日_2008/5/16__2008/6/1 <--- 最初の締日 2008/5/31 の翌日 このような関係でしょうか? =締日(B1, A1)+1 これは、標準モジュールの<締日関数>で算出したものです。 Public Function GetDate(ByVal Now As Date, _ ByVal Move As Integer, _ ByVal Hiduke As Integer) As Date GetDate = DateSerial(DatePart("yyyy", Now), _ DatePart("m", Now) + Move - (Hiduke = 99), _ Hiduke * Abs(Hiduke <> 99)) End Function Public Function 締日(ByVal Now As Date, ByVal Hiduke) As Date Dim Move As Integer Move = Abs(Day(Now) > Hiduke) 締日 = GetDate(Now, Move, IIf(Hiduke = "末日", 99, Hiduke)) End Function この締日関数は、エクセルの標準関数でも書けると推察します。 =DATE(YEAR(B1),MONTH(B1)+(DAY(B1)>A1),DAY(A1))+1 ちなみに、D1 にこの式を書けば同じ結果を得ます。 なお、末日の場合も、締日関数のようにIF関数で月と日を操作すればよいです。
- ore-summer
- ベストアンサー率29% (133/454)
まずA1の書式をユーザー定義で0"日"とし、10日なら10とだけ入力するようにする。(表示は10日となる) 月末の場合のみそのまま月末と入力する。 C1には=IF(OR(DATE(YEAR(B1),MONTH(B1),A1)>=B1,A1="月末"),DATE(YEAR(B1),MONTH(B1),A1),DATE(YEAR(B1),MONTH(B1)+1,A1)) でいかがでしょうか?
- jo-zen
- ベストアンサー率42% (848/1995)
ANo.4のjo-zenです。ちょっと補足です。 C1セルにシリアル値で31855などと表示される場合は、セルの書式設定で日付にしてあげてください。
- jo-zen
- ベストアンサー率42% (848/1995)
C1セルに =IF(A1="月末",DATE(YEAR(B1),MONTH(B1)+1,1),IF(DAY(B1)>A1,DATE(YEAR(B1),MONTH(B1)+1,A1+1),DATE(YEAR(B1),MONTH(B1),A1+1))) と入力すればOKかと思います。 A1が、「月末」⇒翌月1日の日付を返す 採用日が〆日より後の場合⇒翌月の〆日の翌日を返す 採用日が〆日当日または前の場合⇒当月の〆日の翌日を返す という処理です。
#2です。 この数式を使う時は。 「ツール」-「アドイン」で「分析ツール」にチェックを入れてください。 そうでないと「EOMONTH」関数が働きません。
=DATE(YEAR(B1),MONTH(B1)+(IF(A1="月末",DAY(EOMONTH(B1,0)),A1)<DAY(B1)),A1+1) でいかがでしょう。 ただ、締め日と採用日が同日の時はどのようにしたらいいのでしょう。
- boatlife
- ベストアンサー率66% (12/18)
こんにちわ =CONCATENATE(MONTH(B1)+1,"月",DAY(A1)+1,"日") ってやってみました。 結果は出ますが、C1のデータがデータが日付じゃなくなってしまいました・・・・