Categories: excel

ExcelVBAで月末日を自動取得!日付処理の基本と応用テクニック

Excelで日付処理を行う場面は、業務の中で非常に多く存在します。
特に「月の最終日」を取得したいというニーズは、請求書の締日処理、勤務表の自動化、帳票作成など、さまざまなシーンで役立ちます。

この記事では、ExcelVBAを使って月末日を取得する方法について詳しく解説します。
初心者の方でも理解できるように、基本的なコードから応用テクニックまでステップバイステップで紹介します。
自動化を進めて業務効率を高めたい方は、ぜひ参考にしてください。


月の最終日とは?Excelでどう扱うか

月の最終日とは、例えば「2025年6月」の場合は「6月30日」、「2024年2月」の場合は「2月29日」のように、月によって異なる日数の末日を意味します。
これをVBAで扱うには、日付を柔軟に処理できる関数を使うことがポイントです。

VBAでは「DateSerial関数」や「Day関数」、「DateAdd関数」などを活用して、月末日を的確に取得できます。
日付を文字列で処理するのではなく、日付型で扱うことで柔軟なロジックが組みやすくなります。


DateSerial関数を使った月末日の取得方法

もっとも基本的な方法は「DateSerial関数」を用いる方法です。
以下は、指定した年と月の末日を取得するコードです。

Function GetLastDay(year As Integer, month As Integer) As Date
GetLastDay = DateSerial(year, month + 1, 0)
End Function

このコードでは「DateSerial(year, month + 1, 0)」という形式で、次の月の0日目=前の月の最終日を取得しています。
たとえば、DateSerial(2025, 7, 0)は「2025年6月30日」を返します。

使用例:

Sub ShowLastDay()
Dim y As Integer
Dim m As Integer
Dim lastDay As Date

y = 2025
m = 6
lastDay = GetLastDay(y, m)

MsgBox "月の最終日は " & Format(lastDay, "yyyy/mm/dd") & " です。"
End Sub

このように表示ダイアログで簡単に確認できます。


現在の月の最終日を取得するコード

「今月の最終日」を求めたいケースでは、以下のように現在の日付から自動的に処理できます。

Function GetCurrentMonthLastDay() As Date
Dim currentDate As Date
currentDate = Date
GetCurrentMonthLastDay = DateSerial(Year(currentDate), Month(currentDate) + 1, 0)
End Function

こちらも DateSerial を活用し、「今の月 + 1、日の部分は0」で前月の末日=今月の末日を取得する仕組みです。


セルの値を元に最終日を取得する方法

セルに入力された日付を基に、該当月の末日を取得する処理も実用的です。

Function GetCellMonthLastDay(targetDate As Date) As Date
GetCellMonthLastDay = DateSerial(Year(targetDate), Month(targetDate) + 1, 0)
End Function

使用例:

Sub ShowCellLastDay()
Dim inputDate As Date
inputDate = Range("A1").Value
MsgBox "セルの月の最終日は " & GetCellMonthLastDay(inputDate)
End Sub

このようにして、シート上の任意の日付から月末日を抽出できます。


月末日をワークシートに出力する

次は、1列に入力された複数の日付に対応し、それぞれの月末日を隣の列に出力する方法です。

Sub OutputLastDayList()
Dim i As Integer
Dim inputDate As Date

For i = 2 To 20
If IsDate(Cells(i, 1).Value) Then
inputDate = Cells(i, 1).Value
Cells(i, 2).Value = DateSerial(Year(inputDate), Month(inputDate) + 1, 0)
Else
Cells(i, 2).Value = "日付エラー"
End If
Next i
End Sub

このマクロを使えば、A列の入力日付に対応する月末日をB列に自動出力することができます。
大量の日付処理も自動で行えるので、非常に便利です。


応用編:月初日と最終日の期間を取得する方法

月末日とあわせて「月初日」も必要なケースでは、以下のように両方取得し、期間を表示することも可能です。

Sub ShowMonthRange()
Dim targetDate As Date
Dim startDate As Date
Dim endDate As Date

targetDate = Date
startDate = DateSerial(Year(targetDate), Month(targetDate), 1)
endDate = DateSerial(Year(targetDate), Month(targetDate) + 1, 0)

MsgBox "今月の期間:" & Format(startDate, "yyyy/mm/dd") & " ~ " & Format(endDate, "yyyy/mm/dd")
End Sub

この処理を使えば、当月のレポートや集計対象期間を簡単に自動化できます。


最終日の曜日を確認したい場合

月の最終日が何曜日なのかを知りたいときは「Weekday関数」を活用します。

Function GetLastDayOfWeek(year As Integer, month As Integer) As String
Dim lastDay As Date
lastDay = DateSerial(year, month + 1, 0)
GetLastDayOfWeek = Format(lastDay, "dddd") ' 日本語:曜日名
End Function

この関数を使えば、「金曜日」や「水曜日」など、曜日も把握できて、シフト作成やカレンダー生成に活用できます。


まとめ:月末日はVBAでスマートに取得しよう

この記事では、ExcelVBAを使って月の最終日を取得する方法について、基礎から応用まで解説しました。

ポイントは以下の通りです:

  • DateSerial(year, month + 1, 0) で月末日を取得できる
  • 今月・セル値・一覧データなど、様々な使い方が可能
  • 曜日や月初日と組み合わせればさらに実用的に

この仕組みを業務に取り入れれば、手作業による日付確認や月末計算のミスを防ぎ、効率的に作業が進められるようになります。

ExcelVBAでの自動化を進めたい方は、まずはこの「月末日取得」からマスターしてみてください。

breakout2010