2019/12/14

月の最終日の計算方法




0.初めに

ある月の最終日の日付を求めたい時には、どうすれば良いでしょうか。

図1.通常表示

最終日の求め方は、図1のように少なくとも3つの方法があります。そのセルに書かれた数式は図2のようになっています。

図2.数式表示

1.日付

まず、Excelの日付計算の特徴についてワークシート関数を例に説明します。

1ー1.日付とは

セルに「2019/12/15」などと入力すると、そのまま表示されるように見えますが、実はExcelが「あ、日付で書いてきたな」と勝手に判断して表示形式を日付型に変更しているだけなのです。ですので、セルの中の値は図2のB2セルで分かる通り「43814」などという数字が入っているのです。
この数字は「シリアル値」と呼ばれ、Excelが「日付は、西暦1900年1月1日からの経過日数で表す」というやり方を決めて計算に使っています。

この「セルの書式」は一旦決まってしまうとユーザが変更しないとそのままとなり、日付を消して普通の数字を入力しても「変な日付」に変わってしまうのはそのためです。

1-2.日付の分解の仕方

日付を「年・月・日」に分解するのには、それぞれ関数を使って「year(日付)」「month(日付)」「day(日付)」 で計算できます。関数の引数である「日付」には、「シリアル値」か「文字列」を入力します。文字列の場合は「=year("2019/12/15")」のようにダブルクォーテーションで囲みます。

1-3.日付の足し算・引き算

「日付は、西暦1900年1月1日からの経過日数で表す」ということから、1日分を数字で表すと「1」ということになります。1週間は「7」です。
また今日を基準に見ると、明日は「+1」で、昨日は「-1」となります。ですので、1月0日というExcel表記は12月31日を指している事になります。

2.「初日の前の日は終わりの日」法

最終日を算出する1つ目の方法として、図2のK4セルで使用した式「=DAY(DATE(B4,D4+1,0))」ですが、下図の上側のように「起算日(ここでは12月1日)の1か月後の日の前日」という考え方です。下側は「起算日(ここでは12月1日)の前日の1か月後の日」ですが同じ式になります。
その最終日を「DAY(日付)」で日付の数値を取り出しています。


3.「専用関数使用」法

もう1つの方法として図2のK6セルで使用した「数か月後の月末=EOMONTH(開始日 , 月)」という関数を使用する方法もあります。今回で言えば、起算日(12月15日)の0か月後の月の最終日を取得する方法で、「=DAY(EOMONTH(B2,0))」という数式になります。
EOMONTH関数はExcel2007以降は標準関数となっていますが、起算日としてわざわざ初日(例えば12月1日)を計算して入れなくても求められる点で使い易い関数となっています。

4.「差分」法

また「期間内の日数・月数=DATEDIF(開始日 , 終了日 , 単位)」の関数を使用して、起算日と起算日+1か月 のデータを引数にすることで起算日を含む月の日数が求まります。図2のK8セルで使用した「=DATEDIF(B2,EDATE(B2,1),"D")」という数式になります。尚、第三引数の単位である「"D"」は、「日数で計算せよ」という意味です。
この中で使われている「EDATE(開始日 , 月数)」は、「開始日から数えて月数だけ経過した日付」を返す関数です。今回の例で言えば12月15日が開始日で、1か月後の日付なので1月15日が返ってきます。DATEDIFを使ってその差分を取ると、12月31日が含まれているため「31」という数字が返ってくる訳です。

但し「EDATE(開始日 , 月数)」の開始日に、例えば「2019/1/30」のような日付を第一引数にすると、「2019/2/28」という「2/30に最も近い正常な日付」が返ります。ですので、この差分法を使用する際には「初日」とかの限定した日を開始日にするものでなければ、誤った値が出ることになりますので十分注意下さい。(私としては、使わない方が良いと思います)
尚、このDATEDIF関数は「=DATEDIF(誕生日 , 今日の日付, "Y")」と使うことで年齢が返る、と色々なサイト・本で紹介されています。