わえなび ワード&エクセル問題集

当サイトはWordとExcelの実力を鍛える最高水準の特訓問題集です。リンクを張るのは自由です。みんなで勉強しましょう!

月末だからEOMONTH、月初や月の途中だからDATEと考えるのは間違いです【Excel関数】

ExcelのEOMONTH関数は、その関数の名前(End of Month)から月の最終日だけを求める関数であるかのように見えます。そのため、「月末を求めるときは必ずEOMONTH関数を使い、月初または月の途中を求めるときはDATE関数を使う」と勘違いしている人が多いようです。

この考え方は誤りです。DATE関数で日にちに「0」を指定すれば月末日を求めることができます。逆に、EOMONTH関数は日数を加減算することによって月末以外の日付を求めることができます。

DATE関数は3つの個別の値(年・月・日)を受け取るのに対して、EOMONTH関数はシリアル値を引数とします。これら2つの関数の違いは年・月・日を別々に受け取るのか、1個のシリアル値を受け取るのかということであって、月末かどうかは全く関係ありません。

そこで、今回は、EOMONTH関数とDATE関数の使い分けについて出題します。2つの関数の正しい仕様を知って、正しく使用しましょう。

目次

1.月末だからEOMONTH関数?

問題

セルA2にシリアル値の日付、セル範囲D2:E2に年月、セルH2に年月日を8桁で入力した。これらに対応する月末日をそれぞれシリアル値で求めなさい。

f:id:waenavi:20201022070332j:plain

 

解説

日付のシリアル値については、当サイトで何回か解説していますので、詳しくはこちらの記事をご覧ください。

指定された日付から月末の日付を求めるにはEOMONTH関数を使うのが普通です(参考:【Excel】EOMONTH関数は月末を求める関数ですが、月初も計算できます)。

  • =EOMONTH(A2,0)

f:id:waenavi:20201022070720j:plain

 

EOMONTH関数は引数として日付のシリアル値を指定し、月末日に相当するシリアル値を返す関数です。簡単に言えば、シリアル値からシリアル値を求めます。

f:id:waenavi:20201022070918j:plain

 

したがって、元の日付がシリアル値として入力されていない場合は原則としてEOMONTH関数を使ってはいけません。決して「月末だからEOMONTH関数」だと思ってはいけません。年と月が分かれて入力されている場合はDATE関数を挿入します。月に1を足して、日にちに「0」を指定します。

  • =DATE(D2,E2+1,0)

f:id:waenavi:20201022071305j:plain

 

この数式は、月に1を足し、日にちを0にしているので、翌月月初の1日前=今月末を表しているのです。

f:id:waenavi:20201022071720j:plain

 

DATE関数は日にちに「0」を指定することで月末日を求めることができます。

  • 先月末:=DATE(年,月,0)
  • 今月末:=DATE(年,月+1,0)
  • 来月末:=DATE(年,月+2,0)

ところで、この数式には2つの疑問点があります。

  • 12月の場合に1を足すと13月になるのでは?
  • 日にちに0を指定していいのか?

この点については、マイクロソフト公式サイトのDATE関数の解説にはっきりと明記されています。

まず、13月になるのか?ということについては「月が12より大きい場合、指定された年の最初の月にその月数を加える。」と記載されています。

If month is greater than 12, month adds that number of months to the first month in the year specified.

 

正確には、12月を超えた場合は、指定された年の1月を「1」として数え、該当する年月を返すという意味です。したがって、13月になった場合は自動的に翌年の1月を返すのでまったく問題ありません。DATE関数の仕様通りの使い方であり、正しい使い方です。

f:id:waenavi:20201022072337j:plain

 

次に、日にちに0を指定していいのか?ということについて「日が1より小さい場合、指定された月の最初の日から、その日数(=指定した日にちの絶対値)に1を加えた大きさを引く。」と記載されています。

If day is less than 1, day subtracts the magnitude that number of days, plus one, from the first day of the month specified.

 

簡単に言えば、指定された月の1日を「1」として、日付をさかのぼって返すという意味です。したがって、0日=前月の末日を返すのでまったく問題ありません。これも、DATE関数の仕様通りの使い方であり、正しい使い方です。

f:id:waenavi:20201022073117j:plain

 

例えば、「=DATE(2020,13,0)」は2020年の大みそかを指します。

f:id:waenavi:20201022072721j:plain

 

このように、月末日を求めるときに、計算の元となる値がシリアル値の場合はEOMONTH関数を使いますが、そうでない場合はDATE関数を使います。月末だからEOMONTHというわけではなく「シリアル値だからEOMONTH関数」なのです。

EOMONTH関数は、シリアル値で入力されている日付をわざわざ年・月・日に分けてから月末日を求めるという手間を省くためにある関数なのですから、逆に、はじめから年・月・日がバラバラに入力されている状態の場合にEOMONTH関数を使う必要はないのです。

f:id:waenavi:20201022073637j:plain

 

年月日が8桁で入力されている場合、TEXT関数を使えばシリアル値に変換できます(参考:【Excel】TEXT関数で数値を日付や時刻のシリアル値に変換する、日付の変換方法まとめ)。

また、LEFT関数とMID関数を使えば年と月を取得することが可能です(参考:【Excel】LEFT関数、RIGHT関数、MID関数で文字列を抽出する方法の基本例題)。したがって、EOMONTH関数・DATE関数のどちらを用いても構わないということになります。

f:id:waenavi:20201022074055j:plain

 

EOMONTH関数を使う場合、その引数はシリアル値なのでTEXT関数を挿入します。なお、EOMONTH関数の引数に日付文字列を指定した場合は自動的に日付のシリアル値として扱いますので、1を掛ける等の数値化は不要です。

  • =EOMONTH(TEXT(H2,"0000-00-00"),0)

f:id:waenavi:20201022074134j:plain

 

DATE関数を使う場合、その引数は年・月・日なのでLEFT関数とMID関数を使って年と月を取り出します。月に1を足して、日にちに「0」を指定します。

  • =DATE(LEFT(H2,4),MID(H2,5,2)+1,0)

f:id:waenavi:20201022074224j:plain

 

2.月初だからDATE関数?

問題

セル範囲A2:B2に年月、セルE2にシリアル値の日付、セルH2に年月日を8桁で入力した。先月の月初の日付をそれぞれシリアル値で求めなさい。

f:id:waenavi:20201022074315j:plain

 

解説

月初を求めるにはDATE関数で、日にちに1を指定すればよいです。

  • =DATE(A2,B2-1,1)

f:id:waenavi:20201022074403j:plain

 

ちなみに、月から1を引くと、1月の前月が0月になってしまいますが問題ありません。マイクロソフト公式サイトには「月が1より小さい場合、指定された年の最初の月から、その月数(=指定した月の絶対値)に1を加えた大きさを引く。」とあります。

If month is less than 1, month subtracts the magnitude of that number of months, plus 1, from the first month in the year specified.

 

さきほどの日にちと同じ考え方で、0月=前年の12月と自動的に解釈されます。

f:id:waenavi:20201022074541j:plain

 

シリアル値が入力されている場合はEOMONTH関数を使います。2か月前の月末に1を足します。

  • =EOMONTH(E2,-2)+1

f:id:waenavi:20201022074653j:plain

 

EOMONTH関数は月末日を求める関数ですが、その翌日は月初なので月初を求める関数でもあることに注意します。「月末じゃないからEOMONTHじゃない」と考えるのは誤りです(参考:【Excel】EOMONTH関数は月末を求める関数ですが、月初も計算できます)。

  • 先月月初:=EOMONTH(シリアル値,-2)+1
  • 今月月初:=EOMONTH(シリアル値,-1)+1
  • 来月月初:=EOMONTH(シリアル値,0)+1

このように、月初の日付を求めるときに、計算の元となる値がシリアル値の場合はEOMONTH関数を使いますが、そうでない場合はDATE関数を使います。「シリアル値だからEOMONTH関数」なのです。シリアル値で入力されている日付をわざわざ年・月・日に分けてから月初を求める必要はないのです。

f:id:waenavi:20201022074947j:plain

 

年月日が8桁で入力されている場合、EOMONTH関数・DATE関数のどちらを用いても構いません。EOMONTH関数を使う場合、その引数はシリアル値なのでTEXT関数を挿入します。

  • =EOMONTH(TEXT(H2,"0000-00-00"),-2)+1

f:id:waenavi:20201022075126j:plain

 

DATE関数を使う場合、その引数は年・月・日なので LEFT関数とMID関数を使って年と月を取り出します。

  • =DATE(LEFT(H2,4),MID(H2,5,2)-1,1)

f:id:waenavi:20201022075150j:plain

 

3.TODAYの場合

問題

TODAY関数を用いて、本日の日付を基準として今月末と前月月初の日付をそれぞれシリアル値で求めなさい。

f:id:waenavi:20201022075214j:plain

 

解説

TODAY関数は現在の日付を表すシリアル値を返します。

f:id:waenavi:20201022075239j:plain

 

したがって、月末であろうと、月初であろうとEOMONTH関数を使います。大事なことなので何度も繰り返しますが、「シリアル値だからEOMONTH関数」なのです。

  • =EOMONTH(TODAY(),0)
  • =EOMONTH(TODAY(),-2)+1

f:id:waenavi:20201022075316j:plain

 

4.月の日数の計算

(1)EOMONTH関数は不要です

問題

セルA1に西暦を4桁で入力した。A列の月についてそれぞれ日数を求めなさい。また、年月を6桁の数値で入力した場合はどうか。

f:id:waenavi:20201022075415j:plain

 

解説

月の日数はそれぞれの月の末日を求めて、その日にちだけを取り出します。この時もEOMONTH関数を使うべきか、DATE関数を使うべきかをしっかりと考えましょう。この場合、シリアル値を作る必要が無いのでDATE関数を使います。

  • =DAY(DATE($A$1,A4+1,0))

f:id:waenavi:20201022075452j:plain

 

年月を6桁の数値で入力した場合、シリアル値に変換すればEOMONTH関数を使って求めることも可能です。

  • =DAY(EOMONTH(TEXT(D4,"0000-00-1"),0))

f:id:waenavi:20201022075525j:plain

 

しかし、LEFTとRIGHTで年・月を分けたほうが分かりやすいと思います。

  • =DAY(DATE(LEFT(D4,4),RIGHT(D4,2)+1,0))

f:id:waenavi:20201022075611j:plain

 

(2)うるう年の判定

問題

セルA1に1901年以降の西暦を4桁で入力した。うるう年であればTRUE、そうでなければFALSEと表示しなさい。

f:id:waenavi:20201022075756j:plain

 

解説

うるう年は、西暦が4の倍数で、100の倍数ではないかまたは400の倍数で判定をすればよいですが、1901年以降であれば2月の日数を求めれば簡単に判定できます。

  • (4の倍数 and 100の倍数でない) or 400の倍数
  • 2月の日数=29

さきほどの問題と同じように、2月の末日(3月0日)をDATE関数を使って求めます。

  • =DAY(DATE(A1,3,0))

f:id:waenavi:20201022075819j:plain

 

これが29であればうるう年です。

  • =DAY(DATE(A1,3,0))=29

f:id:waenavi:20201022075844j:plain

 

5.月末の1週間

問題

セル範囲A2:B2に年月を入力した。この月の最後の1週間の開始日と終了日を求めなさい。

f:id:waenavi:20201022080022j:plain

 

解説

終了日は月末なので「=DATE(A2,B2+1,0)」です。

f:id:waenavi:20201022080050j:plain

 

開始日はその6日前なので「=DATE(A2,B2+1,-6)」です。前述のとおり、引数にマイナスを指定しても全く問題はありません。

f:id:waenavi:20201022080128j:plain

 

翌月月初の1週間前(7日前)なので「=DATE(A2,B2,1)-7」と考えることもできます。

f:id:waenavi:20201022080405j:plain

 

つまり、DATE関数の日にちとその直後にある足し算・引き算は直接計算することができます。

f:id:waenavi:20201022080733j:plain

 

6.月の途中だからDATE関数?

問題

セル範囲A2:B2に年月、セルE2にシリアル値の日付を入力した。翌月の15日をそれぞれシリアル値で求めなさい。

f:id:waenavi:20201022081033j:plain

 

解説

15日に固定するときは、DATE関数の日にちに15を指定すればよいです。

  • =DATE(A2,B2+1,15)

f:id:waenavi:20201022081210j:plain

 

シリアル値が入力されている場合はEOMONTH関数を使います。今月末に15を足します(参考:【Excel】EOMONTH関数を用いた締め日の計算、翌月の支払日の計算)。

  • =EOMONTH(E2,0)+15

f:id:waenavi:20201022081235j:plain

 

EOMONTH関数は月末日を求める関数ですが、それに15を加算すれば翌月の15日になります。15日であってもEOMONTH関数を使います。計算の元となる値がシリアル値の場合はEOMONTH関数を使いますが、そうでない場合はDATE関数を使います。

  • 先月15日:=EOMONTH(シリアル値,-2)+15
  • 今月15日:=EOMONTH(シリアル値,-1)+15
  • 来月15日:=EOMONTH(シリアル値,0)+15

f:id:waenavi:20201022081327j:plain

 

7.さいごに

ネット上には上記の仕様を正しく解説していないサイトが散見され、しかも、残念ながら当サイトよりも検索上位にあります。困ったことです。。。

当サイトには日付と時刻の関数に関する記事がたくさんありますので、時間のある時にぜひ勉強してみてください。

 


解説は以上です。


 


Copyright(C)2018-2020 waenavi, All rights reserved. [www.waenavi.com 定礎 平成三十年八月]
Youtube | 公式サイト | twitter | 著作権 | 運営者情報 | お問い合わせ