EOMONTH関数は月末を求める関数ですが、月末を計算するだけの関数ではありません(参考:
)。EOMONTHだからといって月末を求める練習だけをしていると、EOMONTHをうまく活用できません。そこで、年月の一致を判定する方法などEOMONTH関数の応用事例を出題します。また、月末なのにEOMONTHを使ってはいけないパターンもご紹介します。
目次
- 1.文字列連結
- 2.月末の日付を連続で入力する
- 3.年月一致判定
- 4.空白の場合の処理
- 5.EOMONTHのなかにIFを入れる
- 6.月が替わることの判定
- 7.EOMONTHのように見えてEOMONTHではない例
1.文字列連結
問題
セルA1に入力した日付を基準として、翌月10日の日付を、和暦で「令和~年~月~日払い」の形式で求めなさい。
解説
月末締めで計算をした金額(給与や仕入代金など)を、翌月の10日までに一括で支払うことを「月末締め翌月10日払い」といいます(参考:【Excel】EOMONTH関数を用いた締め日の計算、翌月の支払日の計算)。
翌月の10日はEOMONTH関数で求めることができます。この関数はシリアル値を返すので、そのまま文字を連結するとシリアル値のまま連結することになります。
- =EOMONTH(A1,0)+10 &"払い"
また、表示形式は数値(シリアル値)しか変えられないので、文字列を連結したものは変えることができません。
和暦にしたいときはTEXT関数を使います(参考:【Excel】TEXT関数で数値を日付や時刻のシリアル値に変換する、日付の変換方法まとめ)。
- =TEXT(EOMONTH(A1,0)+10,"ggge年m月d日")&"払い"
別解
文字列を連結せず、シリアル値のまま、ユーザー定義表示形式で「ggge年m月d日払い」にしてもよいです。
2.月末の日付を連続で入力する
問題
セルA1に月初の日付を入力した、セルA2以降にその翌月以降の月初の日付を求めなさい。また、セルB1に月末の日付を入力した。セルB2以降に翌月以降の月末の日付を求めなさい。
解説
翌月の同じ日を求めるにはEDATE関数を求めます(参考:【Excel日付】月単位や年単位の加算、EDATE関数の使い方基本編)。
- =EDATE(A1,1)
翌月の月末を求めるにはEOMONTH関数を使います。
- =EOMONTH(B1,1)
別解
B列の日付は、A列の日付の3か月後の月末なので、EOMONTH関数で求めることも可能です。
- =EOMONTH(A2,3)
3.年月一致判定
問題
セルB4に入力した日付が今月の日付であればTRUE、そうでなければFALSEと表示しなさい。また、来月の日付であればTRUE、そうでなければFALSEと表示しなさい。
解説
今月の日付であれば、今日の日付TODAYと比較して年月が一致するはずなので、年と月をそれぞれイコールであることを判定すればよいのですが、式が長くなります。日付がシリアル値で入力されているのに、わざわざYEARとMONTHに分ける必要はありません。
- =AND(YEAR(B4)=YEAR(TODAY()),MONTH(B4)=MONTH(TODAY()))
それぞれの日付を月末日に変換し、月末日が一致すれば同じ年月であると言えます。年月が一致するかを判定するには、月末日に統一して判定するのがシンプルです。
- =EOMONTH(B4,0)=EOMONTH(TODAY(),0)
また、来月の場合も同様で、来月末と一致すれば来月の日付であることが分かります。
- =EOMONTH(B4,0)=EOMONTH(TODAY(),1)
4.空白の場合の処理
問題
セルA1に入力されている日付の3か月後の月末を求めなさい。ただし、セルA1が空白の場合は、空白とする。
解説
まず、3か月後の月末の日付を求めます。
- =EOMONTH(A1,3)
セルA1を空白にすると「1900/4/30」となります。これは、1900/1/0の3か月後の月末にあたる日付です。
しかし、元のセルが空白なら結果も空白にしたほうが良いです。
- =IF(A1="","",EOMONTH(A1,3))
5.EOMONTHのなかにIFを入れる
問題
セルA2が「ゴールド」であれば5年後の月末、それ以外は3年後の月末を表示しなさい。
解説
セルA2が「ゴールド」であれば60か月後、そうでなければ36か月後と考えれば、「=IF(A2="ゴールド",~,~)」という形になります。
- =IF(A2="ゴールド",EOMONTH(A1,60),EOMONTH(A1,36))
しかし、EOMONTH(A1,60)、EOMONTH(A1,36)は月数が異なるだけです。月数が異なるだけの場合は、EOMONTHを外にして、IF関数を第2引数に入れるほうがシンプルです。
- =EOMONTH(A1,IF(A2="ゴールド",60,36))
6.月が替わることの判定
問題
セルA1に任意の日付を入力した。1ずつ加算すると翌月の日付になる。月末の日付まで表示し、月が替わったら空白にしなさい。
解説
1を加算するだけで連続する日付を入力することができます(参考:【Excel】完全マスター!日付の足し算と引き算を使った日数の計算問題)。
- =A1+1
セルA1と比較して、月が不一致なら月が替わったと考えます。
- =IF(MONTH($A$1)=MONTH(A1+1),A1+1,"")
このとき、空白の次がエラーになるので、IFERROR関数を用いてエラーのときに空白になるようにします。
- =IFERROR(IF(MONTH($A$1)=MONTH(A1+1),A1+1,""),"")
別解
セルA1の日付から月末の日付を求めて、それを超えたら月が替わったと考えることもできます。
- =IF(A1+1>EOMONTH(A1,0),"",A1+1)
この場合も、空白の次がエラーになるので、 IFERROR関数を用いてエラーのときに空白になるようにします。
- =IFERROR(IF(A1+1>EOMONTH(A1,0),"",A1+1),"")
*補足*
関数で処理するのではなく、条件付き書式で「白色の文字」にして見えなくする方法もあります。この場合はIFERRORが不要となり、論理式だけで済みます。
- =A2>EOMONTH($A$1,0)
7.EOMONTHのように見えてEOMONTHではない例
(1)月末だけどDATE関数を使うパターン
問題
セルA1に西暦年4桁、セルA2に月を入力した。この年月の月初と月末の日付を求めなさい。
解説
月初と月末の日付を求めるには、月末を求める関数であるEOMONTH関数を使いますが、EOMONTH関数は、日付がシリアル値になっている場合に限って使うことができます。この問題のように、年月を分けて入力している場合は、DATE関数を使います。
- =DATE(A1,A2,1)
月末は第3引数を0にすればよいです。
- =DATE(A1,A2+1,0)
(2)年月を抜き出すだけのパターン
問題
A列にランダムで日付を入力した。2020年6月の日付が何個あるか求めなさい。
解説
前述のとおり、年月だけの一致判定をするにはEOMONTH関数を使いますが、日付から年月だけを取り出すにはTEXT関数を使ったほうが早いです(参考:【Excel】TEXT関数で数値を日付や時刻のシリアル値に変換する、日付の変換方法まとめ)。
- =TEXT(A2,"yyyymm")*1
個数を求めることもできます。
- =COUNTIF(B:B,202006)
別解
ピボットテーブルを使えば、年月ごとにグループ化して集計することができますので、関数不要です(参考:【Excel】ピボットテーブルで度数分布表(ヒストグラム)を作成する方法)。
解説は以上です。