• ベストアンサー

日付関数を教えてください。

エクセルで、 セルA1に月の締め日を、セルB1に採用日を入力した場合に、 セルC1に最初にくる締め日の初日を表示する関数を教えてください。 なお、月の締め日の入力には、数字の他に「月末」という表現をする場合がありますが出来るでしょうか。 例 セル A1(締め日)が 10日で、B1(採用日)が 5月16日の場合   セル C1(最初に来る締め日の翌日)は 6月11日 となります。 よろしく、お願いいたします。  

質問者が選んだベストアンサー

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.7

月末の場合は、翌月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)
回答No.11

追記。 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月の処理に失敗しています。

回答No.10

#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)
回答No.9

他の回答だと「採用日が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日") と言う式になる。

noname#140971
noname#140971
回答No.8

エクセルは操作したこともない門外漢ですので大よその書き方のアイデアだけ・・・。 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関数で月と日を操作すればよいです。

回答No.6

まず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)
回答No.5

ANo.4のjo-zenです。ちょっと補足です。 C1セルにシリアル値で31855などと表示される場合は、セルの書式設定で日付にしてあげてください。

  • jo-zen
  • ベストアンサー率42% (848/1995)
回答No.4

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日の日付を返す   採用日が〆日より後の場合⇒翌月の〆日の翌日を返す   採用日が〆日当日または前の場合⇒当月の〆日の翌日を返す という処理です。

noname#79209
noname#79209
回答No.3

#2です。 この数式を使う時は。 「ツール」-「アドイン」で「分析ツール」にチェックを入れてください。 そうでないと「EOMONTH」関数が働きません。

noname#79209
noname#79209
回答No.2

=DATE(YEAR(B1),MONTH(B1)+(IF(A1="月末",DAY(EOMONTH(B1,0)),A1)<DAY(B1)),A1+1) でいかがでしょう。 ただ、締め日と採用日が同日の時はどのようにしたらいいのでしょう。

  • boatlife
  • ベストアンサー率66% (12/18)
回答No.1

こんにちわ =CONCATENATE(MONTH(B1)+1,"月",DAY(A1)+1,"日") ってやってみました。 結果は出ますが、C1のデータがデータが日付じゃなくなってしまいました・・・・