EOMONTH 関数


書式

EOMONTH関数の"EO"とは、"End Of"の略です。つまり、End Of Month = 月末の日 を取得する関数です。Excel 2003までは「分析ツール」アドインを組み込まないと使えなかったのですが、Excel 2007以降は標準の関数に格上げされました。なので、2007以降であれば、どのExcelでも使用できます。この関数、メッチャ便利です。

まず、このEOMONTH関数が使えなかった時代、どうやって月末の日を求めていたかをご紹介します。いわゆる古典的なやり方です。たとえば「2019/03/15」という日付があったとき「この日付の月(3月)の月末日」は、次のように考えました。

「2019/03/15」をDATE関数で表すと「DATE(2019,3,15)」です。

このとき

  • 2019 → 「2019/03/15」の
  • 3 → 「2019/03/15」の
  • 15 → 「2019/03/15」の
ですね。任意の日付から年月日を求めるには、それぞれYEAR関数、MONTH関数、DAY関数を使います。
  • 2019 → 「2019/03/15」の年 → YEAR(2019/03/15)
  • 3 → 「2019/03/15」の月 → MONTH(2019/03/15)
  • 15 → 「2019/03/15」の日 → DAY(2019/03/15)

では、この「2019/03/15」という日付がセルA1に入力されていたとします。すると、次のように考えられます。

  • 2019 → 「2019/03/15」の年 → YEAR(2019/03/15) → YEAR(A1)
  • 3 → 「2019/03/15」の月 → MONTH(2019/03/15) → MONTH(A1)
  • 15 → 「2019/03/15」の日 → DAY(2019/03/15) → DAY(A1)

ところで、この月(3月)の月末日「3/31」とは、どういうことでしょう。言うまでもありませんが、「3/31」というのは「4/1」の前日です。Excelは日付を"シリアル値"で管理していますので、任意の日の"前日"というのは、その日から1を引けば分かります。

つまり、今回与えられた「2019/03/15」という日付から、翌月の1日である「2019/04/01」を作ることができれば、そこから1を引いた日こそが「3月の月末日」だということです。

任意の日付(ここでは 2019/03/15)から、翌月の1日を求めるには、次のように考えます。まず、先の「DATE(YEAR(A1),MONTH(A1),DAY(A1))」のうち、日を表す「DAY(A1)」部分に、1を指定します。これは「この月(3月)の1日」ということです。

求めたいのは翌月なのですから、このうち、月を表す「MONTH(A1)」に1を加えます。

最終的に欲しいのは、この日の前日です。なので、全体から1を引きます。

DATE関数では、このように年月日を計算で指定できます。もし、計算結果が"14月"とか"40日"になるようなときは、Excelがうまく調整してくれます。Excelって賢いですね~

EOMONTH関数なら超簡単

このように、"頭の体操"的な発想をしなければ求められなかった月末の日ですが、EOMONTH関数なら簡単です。EOMONTH関数には、次の引数を指定します。

引数「開始日」には、基準となる日を指定します。ここまでの解説なら「2019/03/15」です。引数「月」には"何ヶ月後の"月末日を求めるかの月数を指定します。3ヶ月後なら「3」、2ヶ月前なら「-2」です。今回は同じ月の月末日ですから、引数「月」には「0」を指定します。

ね、超簡単でしょ。さらに嬉しいことに、このEOMONTH関数は、VBAでWorksheetFunctionから呼び出すこともできます。私的には、こっちの方が256倍嬉しいです。たとえば、下のような表にオートフィルタをかけるとします。

A列には2019年の日付がランダムに入力されています。この日付を「3月」で絞り込みます。

Sub Macro1()
    Dim D As Date
    D = "2019/3/1"
    Range("A1").AutoFilter 1, ">=" & D, xlAnd, "<=" & WorksheetFunction.EoMonth(D, 0)
End Sub

たった、こんだけです。

オマケで、1月から12月まで月別に分割してみましょう。元表は、Sheet1にあるとします。

Sub Macro2()
    Dim i As Long, D As Date
    With Sheets("Sheet1")
        For i = 1 To 12
            D = DateSerial(2019, i, 1)
            .Range("A1").AutoFilter 1, ">=" & D, xlAnd, "<=" & WorksheetFunction.EoMonth(D, 0)
            .Range("A1").CurrentRegion.Copy Sheets.Add(After:=Sheets(Sheets.Count)).Range("A1")
            ActiveSheet.Name = i & "月"
        Next i
    End With
End Sub

結果は、次のとおり。