【VBAリファレンス】Excel業務を劇的に効率化する月の最終日取得の完全ガイド

スポンサーリンク

概要
Excelでの業務において、「月の最終日を求める」という要件は、経理、人事、プロジェクト管理など多岐にわたるシーンで必ずと言っていいほど発生します。「月末締め」の計算、翌月への繰越処理、あるいは当月の日数算出など、この値を正確に導き出すことは自動化の第一歩です。しかし、28日、30日、31日、そして4年に一度の閏年というカレンダーの変則性が、多くのユーザーを悩ませる要因となっています。本記事では、Excelの標準関数を駆使した効率的な手法から、VBAを用いた高度な自動化、さらには実務での活用テクニックまで、ベテラン講師の視点で余すことなく徹底解説します。

EOMONTH関数によるスマートな解決策

Excelで月の最終日を求める際の「正攻法」は、間違いなくEOMONTH関数です。EOMONTHとは「End Of Month」の略称であり、指定した日付から数えて「何ヶ月前または何ヶ月後の月末日」を自動的に返してくれる非常に強力な関数です。

基本構文:=EOMONTH(開始日, 月)

例えば、A1セルに「2023/10/15」と入力されている場合、その月の末日を求めるには以下の数式を使用します。
=EOMONTH(A1, 0)

ここでのポイントは、第2引数の「0」です。この値を「0」にすることで、開始日が含まれるその月の末日を返します。もし「1」を指定すれば翌月の末日、「-1」を指定すれば前月の末日が得られます。この関数の最大の利点は、閏年を自動的に判定してくれる点にあります。2月の28日や29日を気にする必要は一切ありません。Excelが日付シリアル値を計算し、常に正しいカレンダー上の末日を算出してくれるため、メンテナンスフリーな数式として広く推奨されます。

DATE関数による算術的アプローチ

EOMONTH関数が利用できない極めて特殊な環境や、あるいは日付計算のロジックを深く理解したいという方のために、DATE関数を用いた手法も習得しておきましょう。DATE関数で翌月の1日(ついたち)を求め、そこから1日を引くというロジックです。

数式の例:
=DATE(YEAR(A1), MONTH(A1) + 1, 0)

この数式のカラクリを紐解くと非常に興味深いです。DATE関数には「日付に0を指定すると、前月の末日になる」という仕様があります。つまり、「翌月の0日目」を計算させることで、実質的に「当月の末日」を導き出しているのです。この手法は、EOMONTH関数が存在しなかった古いバージョンのExcel時代から使われてきた「枯れた技術」ですが、論理的な美しさという点では非常に洗練されています。

VBAで月の最終日を扱うテクニック

VBAで開発を行う際、シート上の関数を呼び出すだけでなく、VBA独自の関数で末日を制御したいというニーズも高いはずです。VBAにおいては、DateSerial関数を活用するのが定石です。


Function GetEndOfMonth(targetDate As Date) As Date
    ' 翌月の1日を求め、そこから1日を引くことで末日を取得する
    GetEndOfMonth = DateSerial(Year(targetDate), Month(targetDate) + 1, 0)
End Function

Sub TestEndOfMonth()
    Dim myDate As Date
    myDate = DateSerial(2024, 2, 1) ' 閏年の2月
    MsgBox "2024年2月の末日は: " & GetEndOfMonth(myDate)
End Sub

上記のコードでは、DateSerial関数を使用しています。VBAのDateSerialも、ExcelのDATE関数と同様に、「日」の引数に0を指定することで前月末の日付を返す性質を持っています。これを利用すれば、複雑な閏年判定のIf文を書く必要は一切ありません。コードの可読性を高め、かつバグの発生リスクを最小限に抑えるためのベストプラクティスです。

実務における応用と注意点

実務において月の最終日を求める目的は、多くの場合「期間計算」や「締日処理」です。ここでいくつか、現場で役立つ応用テクニックを紹介します。

1. 稼働日の考慮
月の最終日が土日祝日の場合、その前の営業日を求める必要があるケースが多いでしょう。この場合、WORKDAY.INTL関数とEOMONTH関数を組み合わせるのが最適です。
=WORKDAY.INTL(EOMONTH(A1, 0) + 1, -1, “0000011”)
この数式は、月の末日から遡って最初の営業日を導き出します。

2. 表示形式の罠
関数で正しく日付が計算できているのに、「12345」のような数字が表示されてしまうことがあります。これはExcelのセル表示形式が「標準」になっているためです。日付として正しく表示するには、セルの書式設定を「日付」に変更するか、TEXT関数を使って =TEXT(EOMONTH(A1,0), “yyyy/mm/dd”) と記述して文字列として整形しましょう。

3. 動的なカレンダー作成
月末日を自動算出することで、月ごとのカレンダーを動的に作成できます。A1セルに年、B1セルに月を入力し、その下の列に1日から末日までを並べる際、EOMONTH関数を条件付き書式の判定に組み込めば、翌月の日付を自動的に非表示にするなどの高度なレイアウトも可能です。

エラー回避の鉄則

意外と見落としがちなのが、入力値が「日付型」として認識されているかという点です。セルに「2023.10.31」とピリオドで入力されている場合、Excelはこれを文字列として判定します。このままではEOMONTH関数はエラー(#VALUE!)を返します。必ずDATEVALUE関数で変換するか、入力規則を使って正しい日付形式での入力を促すよう設計してください。また、VBAで処理する際は、必ずIsDate関数を用いて引数の妥当性をチェックする習慣をつけましょう。

まとめ

Excelで月の最終日を求めることは、単なる数値計算ではなく、正確な業務フローを構築するための基盤です。EOMONTH関数という強力なツールを使いこなすことはもちろん、DATE関数やDateSerial関数の論理的背景を理解することで、予期せぬエラーにも対応できる柔軟なスキルが身につきます。

今回紹介した手法は、いずれもシンプルでありながら、実務における「日付の悩み」をすべて解消するものです。まずはご自身の作成しているワークシートやVBAプロジェクトに、これらのロジックを取り入れてみてください。日付をコントロールする力は、Excel中級者から上級者へステップアップするための重要な鍵となります。正しい日付管理こそが、ミスのない効率的な業務の第一歩であることを忘れないでください。

タイトルとURLをコピーしました