Excelで日付処理を行う場面は、業務の中で非常に多く存在します。
特に「月の最終日」を取得したいというニーズは、請求書の締日処理、勤務表の自動化、帳票作成など、さまざまなシーンで役立ちます。
この記事では、ExcelVBAを使って月末日を取得する方法について詳しく解説します。
初心者の方でも理解できるように、基本的なコードから応用テクニックまでステップバイステップで紹介します。
自動化を進めて業務効率を高めたい方は、ぜひ参考にしてください。
月の最終日とは、例えば「2025年6月」の場合は「6月30日」、「2024年2月」の場合は「2月29日」のように、月によって異なる日数の末日を意味します。
これをVBAで扱うには、日付を柔軟に処理できる関数を使うことがポイントです。
VBAでは「DateSerial関数」や「Day関数」、「DateAdd関数」などを活用して、月末日を的確に取得できます。
日付を文字列で処理するのではなく、日付型で扱うことで柔軟なロジックが組みやすくなります。
もっとも基本的な方法は「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
この関数を使えば、「金曜日」や「水曜日」など、曜日も把握できて、シフト作成やカレンダー生成に活用できます。
この記事では、ExcelVBAを使って月の最終日を取得する方法について、基礎から応用まで解説しました。
ポイントは以下の通りです:
DateSerial(year, month + 1, 0)
で月末日を取得できるこの仕組みを業務に取り入れれば、手作業による日付確認や月末計算のミスを防ぎ、効率的に作業が進められるようになります。
ExcelVBAでの自動化を進めたい方は、まずはこの「月末日取得」からマスターしてみてください。