満月数ではなくて、とにかく月末をもって「1か月」ってカウントしたい!
DATEDIF関数とEOMONTH関数でなんとかしましょう!
契約期間や入会期間の月数を集計するとき、月末をもって「1ヶ月」として扱いたい場面があります。
月数を求める関数といえば、DATEDIF関数。
しかし、DATEDIF関数が求めるのは満月数。1日だけの契約期間は「0ヶ月」とカウントされます。
これをなんとかする手段が、DATEDIF関数とEOMONTH関数との合わせ技です。
数式の実例:DATEDIF関数とEOMONTH関数で月末をもって1ヶ月とみなす月数の集計
前提は、満月数に満たない日数でも、月末をもって1か月とみなす。
DATEDIF関数とEOMONTH関数を組み合わせた数式は、こちらです。
=DATEDIF(EOMONTH(A2,-1)+1, EOMONTH(B2,0),”M”)+1
実際に、A列[契約開始日]・B列[契約終了日]が入力されているシートで、契約月数(非 満月数)を求めてみました。
数式の解説:考え方・EOMONTH関数・DATEDIF関数
DATEDIF関数にEOMONTH関数をネストした数式は、ちょっと難解。
それぞれの関数の動きを分解して解説します。
しかし、その前に…そもそもなぜEOMONTH関数を使うのか?という点について触れておきます。
考え方:なぜEOMONTH関数を使うのか?
月末をもって1ヶ月とみなす –> 開始日は、どんな日付でも月初を起点としていい
たとえば、契約開始日が「2023/3/30」だとします。
1ヶ月で締めるという考え方では、日にちを無視できます。
30日であっても、15日であっても、2日であっても、3月度の契約には変わりがないので、契約開始日は「2023/3/1」とみなせます。
そこで、EOMONTH関数を使って月初の日付を求めます。
月末をもって1ヶ月とみなす –> 終了日は、どんな日付でも月末を終点としていい
たとえば、契約終了日が契約開始日と同じ「2023/3/30」だとします。
1ヶ月で締めるという考え方では、どんな日にちであっても月末までの契約なので、契約終了日は「2023/3/31」とみなせます。
そこで、EOMONTH関数を使って月末の日付を求めます。
EOMONTH関数で月初・月末の日付を求める
=DATEDIF(EOMONTH(A2,-1)+1, EOMONTH(B2,0), “M”)+1
EOMONTH関数を2つ使っています。
契約開始日から[月初の日付]、契約終了日から[月末の日付]を求めています。
解説のために、元の数式の中身を書き換えると、このようになります。
=DATEDIF([月初の日付], [月末の日付], “M”)+1
月末・月初の日付を求めるEOMONTH関数の使い方については、こちらの記事で解説しています。
DATEDIF関数で月初・月末の満月数を求める
DATEDIF関数に、[月初の日付]と[月末の日付]を渡して、満月数を求めています。
月初から月末までの日数では満月数を満たせず、「0ヶ月」からカウントされることになります。
常に1ヶ月足りないので、数式の最後で「+1」しています。
=DATEDIF([月初の日付], [月末の日付], “M”)+1
おまけ:ネストしないDATEDIF関数とEOMONTH関数を使った数式の書き方
ネストする数式の書き方がわかりづらい場合は、列を追加してみましょう。
- C列:EOMONTH関数で契約開始日の月初を求める。
- D列:EOMONTH関数で契約開始日の月末を求める。
月末・月初の日付を求めるEOMONTH関数の使い方については、こちらの記事で解説しています。
DATEDIF関数で、C列・D列を参照すれば、シンプルな数式になります。
=DATEDIF(C2, D2, “M”)+1
ネストしないDATEDIF関数とEOMONTH関数を使った実装イメージはこちら。
C列・D列を非表示にしておけば、よりシンプルに見えます。
まとめ
DATEDIF関数とEOMONTH関数を使って、月末をもって「1ヶ月」とカウントする方法を解説しました。