ExcelのEOMONTH関数を使った完全ガイド:月末日を正確に計算する

クイックリンク
- EOMONTHの構文
- 未来の月末日を計算する
- 過去の月末日を計算する
- 長期(年単位)の過去/未来月末日
- 今月の月末日を計算する
- 月末日シーケンスを生成する
- よくある落とし穴と対策
- 役割別チェックリスト
EOMONTHの構文
EOMONTH関数は2つの引数を取ります。
=EOMONTH(a,b)
- a: 開始日(任意の日付)。セル参照/DATE関数/TODAY関数などで指定できます。
- b: 開始日からの月数の増減。正は未来へ、負は過去へ、0は同じ月の末日。
使用例(入力形式の例はExcelの標準的な日付シリアルを前提とします):
引数 a の例 | 説明 |
---|---|
=EOMONTH(A1, | A1の値を開始日として使用。 |
=EOMONTH(DATE(2025,5,31), | 2025年5月31日を開始日として使用。 |
=EOMONTH(TODAY(), | 今日の日付を開始日として使用。 |
引数 b は直接数値を書いても良いし、別セルを参照して可変にしても良いです。
引数 b の例 | 説明 |
---|---|
=EOMONTH(A1, 5) | 開始日から5か月後の月の末日を返す。 |
=EOMONTH(A1, -5) | 開始日から5か月前の月の末日を返す。 |
=EOMONTH(A1, 0) | 開始日の属する月の末日を返す。 |
=EOMONTH(A1, A2) | A2の数値に従って前後する月の末日を返す。 |
注意: EOMONTHは「月の最後の日」を返し、日付形式のシリアル値を返します。適切なセル書式(例:yyyy/m/d、または日本語ロケールの標準形式)を設定してください。Excelのリボンで「表示形式」を「標準(または標準的な数値形式)」に戻す必要がある場面もあります。
未来の月末日を計算する(実践例)
想定シナリオ:建設会社のプロジェクト管理。各プロジェクトには開始日と所要月数があり、締切は各月の末日です。E列に「End date(終了日)」を計算します。
手順(テーブル形式のデータを想定):
- E2セルに以下を入力:
=EOMONTH([@[Start date]],[@Months])
- テーブル形式なら構造化参照が自動で使われ、最初のセルに入れるだけで列全体に自動適用されます。通常の範囲ならフィルハンドルでコピーします。
例(通常のセル参照の場合):
=EOMONTH(D2,B2)
例えば、開始日が2025/01/04で、移動月数が3なら、EOMONTHは2025/04/30を返します(2025-04-04の月末)。
利点:
- 数式を変更せずに開始日や月数を変えられる。
- 列全体で一貫したロジックを適用できる。
過去の月末日を計算する(実践例)
別シナリオ:プロジェクトの締切(Deadline)があり、そこから逆算して「遅くともいつ開始すべきか」を月末単位で算出したい場合。
要件例: 所要月数が5か月のプロジェクトは、余裕のため期限から6か月前の月末を「開始日」としたい。
D2に入力する式:
=EOMONTH([@Deadline], -[@Months]-1)
式の読み方:
- [@Deadline] は締切日(基準日)。
- -[@Months] で所要月数分だけ過去へジャンプ。
- さらに -1 して余裕を1か月確保。
- 最終的にEOMONTHがその月の末日を返す。
事例: 締切が2026/01/27、所要月数が5なら、EOMONTHは2025/07/31を返します(5か月前は2025/08、さらに1か月戻って2025/07の末日)。
年単位での過去/未来(月数換算)
EOMONTHは月単位で移動するため、年数で表現したい場合は年数×12を引数bに使います。
例(開始日から年数で終期を求める):
=EOMONTH([@[Start date]],[@Years]*12)
逆方向(過去へ戻す):
=EOMONTH([@[Start date]], -[@Years]*12)
具体例: 開始日が2025/01/04でYearsが2なら、2年=24か月で2027/01/31が返ります。
今月の月末日/残り日数を計算する
月の残り日数を求める有用な式:
=EOMONTH(TODAY(),0)-TODAY()
- EOMONTH(TODAY(),0) は今月の末日(シリアル)を返す。
- TODAY() は今日の日付(シリアル)。
- 引き算で残日数を算出する。
注意点: 結果が日付表示になってしまうことがあります。その場合はセルの表示形式を「標準」または数値に変更してください(日本語版Excelでは[ホーム]タブ→表示形式→「標準」や「数値」)。
日割り予算の計算例:
セルB1: 残り日数(上の式) セルB6: 利用可能総予算 セルB7: 1日あたりの支出可能額:
=B6/B1
(B1が0にならないように条件分岐やIFERRORで安全策を入れることを推奨)
SEQUENCEと組み合わせて月末日シーケンスを生成する
SEQUENCE関数をEOMONTHのb引数に渡すと、月末日の配列を一度に生成できます。これにより年次・四半期・隔月などの一覧を動的に作れます。
SEQUENCEの基本:
=SEQUENCE(rows, cols, start, step)
- rows: 行数(返す要素数)
- cols: 列数(通常は1)
- start: シーケンスの開始値(省略可)
- step: インクリメント(省略可、デフォルトは1)
例: 2025年の各月末日を配列で返す:
=EOMONTH(DATE(2024,12,31), SEQUENCE(12))
- DATE(2024,12,31) を開始日として渡すことで、翌月(2025/01)の月末から始める。
- SEQUENCE(12) は1から12までの配列を返すため、EOMONTHは1か月後〜12か月後の月末を返す。
隔月(2か月ごと):
=EOMONTH(DATE(2024,12,31), SEQUENCE(6,, ,2))
四半期(日付を指定して四半期末を一覧にする):
=EOMONTH(DATE(2025,2,28), SEQUENCE(4,, ,3))
注意: SEQUENCEは動的配列を返します。結果がスピル(spill)するセル範囲は通常の範囲である必要があり、Excelテーブルでは動的配列は直接使えません。
結果を固定化したい場合は、生成後にセルをコピー→値のみ貼り付け(Ctrl+C→Ctrl+Shift+V)で値に置き換えます。
EOMONTHのよくある落とし穴と対策
日付が正しくない/シリアル値が日付表示される
- 原因: 結果が日付シリアルなのに表示形式が日付になっている/逆に数値になっている。
- 対策: 必要に応じて表示形式を「日付」または「標準」に切り替える。
31日が絡む月(31日→短い月)
- EOMONTHは「月の末日」を返すので、開始日が31日の場合でも、短い月の末日に正しく切り替わります(例:1月31日の1か月後は2月28日または29日)。
- 対策: 特別な処理不要。ただし業務ルールで「同日」を維持したいならEDATEを検討。
年をまたぐ計算の誤認識
- EOMONTHは月数で計算するため、年をまたぐ場合でも問題なく動作します。ただし、人間側で「何年何月の末日か」を明示しておくと誤解を防げます。
テーブル+動的配列の不整合
- SEQUENCEなどを使って動的配列をスピルさせようとすると、Excelテーブル内ではエラーになることがあります。テーブル外の通常セルに置くか、値に変換してからテーブルに読み込んでください。
ローカル日付形式の違い(日本ロケールと米国ロケールなど)
- Excelの表示設定がロケール依存のため、日付文字列を直接入力する場合は注意。安全策としてDATE関数で年・月・日を指定することを推奨します。
EOMONTHとEDATEの違い(いつ使い分けるか)
- EOMONTH: 指定した期間の「末日」を返す。締め日や請求日、月次レポートの期日算出に最適。
- EDATE: 指定期間の「同日」を返す(例:1月15日の1か月後は2月15日)。業務で締め日ではなく同日を基準にする場合に使う。
簡易判断ルール:
- 目的が「月末」「期末」「締切(末日固定)」 → EOMONTH
- 目的が「同じ日・同じ日付番号を維持したい」 → EDATE
追加の実践例とテンプレート集
- プロジェクト管理テンプレート(サマリ):
- 列A: Project ID
- 列B: Duration (months)
- 列C: Owner
- 列D: Start Date
- 列E: End Date → =EOMONTH(D2,B2)
- 列F: Days remaining to end (if End Date in future) → =IF(E2>TODAY(),E2-TODAY(),0)
- 月次請求テンプレート(請求月の月末を基準):
- InvoiceDate: =EOMONTH(TODAY(),0)
- DueDate: =EOMONTH(TODAY(),1) (次月末)
- 四半期レポート生成(任意の年):
=EOMONTH(DATE(2024,12,31), SEQUENCE(4,, ,3))
- 年度開始からnヶ月ごとの期末をリスト化(例: 6か月ごと):
=EOMONTH(DATE(2024,3,31), SEQUENCE(6,, ,6))
トラブルシューティングQ&A(現場でよくある問題)
Q1: EOMONTHの結果が#VALUE!になる
- 原因: a引数が日付として認識されていない(文字列など)。
- 対策: DATE関数で明示するか、VALUE関数で変換、またはセルの書式を日付に直す。
Q2: SEQUENCEがテーブル内で機能しない
- 原因: 動的配列関数はテーブル内部でスピルできない。
- 対策: テーブルの外に置く、または結果を値として貼り付けてテーブル化する。
Q3: 計算が遅い(大量の行)
- 原因: 複雑な構造化参照+動的配列+他関数の組合せで再計算が多い。
- 対策: 必要な範囲のみ計算、値貼り付けで固定化、或いは計算モードを手動に切替えてから変更→再計算。
役割別チェックリスト(導入・運用時)
プロジェクトマネージャー:
- 各タスクの「開始日」「所要月数」を正確に入力しているか
- 余裕期間(バッファ)を設計し、EOMONTHの引数で調整しているか
- テーブル構造を利用して一括更新ができるか
経理(請求・締め):
- 締め日が月末で固定されているか(EOMONTHが最適)
- 四半期末・年末処理のテンプレートを予め用意しているか
- 日付のロケール(和暦/西暦)で表示ミスがないかを確認
データアナリスト:
- 動的配列を利用する際、テーブルと併用していないか
- 大量データでの再計算コストを評価しているか
- 関数の互換性(Excelバージョン)をチェックしているか
セキュリティ・プライバシー注意点
- EOMONTH自体は数式計算のための関数であり、個人情報や機密データを扱う場合はシートのアクセス制御を徹底してください。
- クラウドで共有する場合、誰がセルの値や式を編集できるかを明確にしてください(編集権限の管理)。
ミニメソッド:月末日計算をプロジェクトに組み込む手順
- 要件定義:締切が月末に固定か、同日ベースかを決定。
- テンプレート作成:Start/Months/Endなど基本列を作る。
- 数式適用:EOMONTHを導入して列に展開。
- 検証:代表的なケース(2月・閏年・31日)で期待値と一致するかテスト。
- 文書化:所用時間、バッファ、例外ルールを注記。
- 運用:定期レビューでテンプレートを更新。
エッジケースギャラリー(具体例で理解する)
- 開始日が1月31日、1か月後:EOMONTH(2025/01/31,1) → 2025/02/28(閏年でなければ)
- 開始日が2024/01/31(閏年前)、1か月後:EOMONTH(2024/01/31,1) → 2024/02/29(2024年は閏年)
- 負の引数で年をまたぐ:EOMONTH(2025/03/15,-15) は 2023/12/31 を返す(15か月前の末日)
テストケース(受け入れ基準)
- 入力: 開始日=2025/01/04, Months=3 ⇒ 出力=2025/04/30
- 入力: 締切=2026/01/27, Months=5 ⇒ Start計算式 =EOMONTH(Deadline,-Months-1) ⇒ 出力=2025/07/31
- 閏年テスト: 入力: 2024/01/31,1 ⇒ 2024/02/29
- SEQUENCEテスト: =EOMONTH(DATE(2024,12,31),SEQUENCE(12)) ⇒ 2025年各月の月末が12個返る
これらのテストが全て満たされれば、基本的な動作要件を満たしていると判断できます。
メンタルモデル(直感的に理解するための比喩)
- EOMONTHは「与えた日付からカレンダーを◯か月めくって、その月の最後のページ(末日)を切り取る道具」です。
- EDATEは「ページをめくって同じ行(同じ日)を探す道具」です。
この違いをイメージできれば、どちらを使うべきか即座に判断できます。
まとめ
- EOMONTHは月末日を返す便利な関数で、締め処理・請求・四半期集計・逆算開始日の算出などに最適。
- 年単位の移動は月数(年×12)で扱う。
- SEQUENCEと組み合わせれば月次・隔月・四半期の一覧を一気に生成できる。
- 主な落とし穴は日付の表示形式、テーブルと動的配列の不整合、31日絡みの期待差異。
- 同じ日付番号を維持したいならEDATEを選ぶ。
重要: 実務で使う際は必ず代表的なテストケース(閏年、31日→短い月、年跨ぎ)を検証してから本番データへ適用してください。
この記事でカバーした主な式(参考まとめ):
=EOMONTH(A1,5) // A1の5か月後の月末
=EOMONTH(A1,-5) // A1の5か月前の月末
=EOMONTH(TODAY(),0) // 今月の末日
=EOMONTH([@Deadline],-[@Months]-1) // 締切から逆算して余裕1か月を考慮した開始月末
=EOMONTH([@[Start date]],[@Years]*12) // 年数×12で年単位の終期を取得
=EOMONTH(DATE(2024,12,31),SEQUENCE(12)) // 2025年の各月末を配列で返す
役割別チェックリストとテストケースを使って、ワークブックに安全に導入してください。