【VBA】月の末日を求める

月の末日を求めるにはDateAdd関数を使用します。

コードと解説

コード

月の末日を求めるコードは以下になります。

 1Option Explicit
 2Sub getMonthLastDay()
 3  
 4  Dim dayStr As String
 5  dayStr = InputBox("日付をyyyy/m、またはyyyy/m/dの形式で入力してください。")
 6  If dayStr = "" Then
 7    Exit Sub
 8  End If
 9  If IsDate(dayStr) = False Then
10    MsgBox "日付をyyyy/m、またはyyyy/m/dの形式で入力してください。", vbCritical
11    Exit Sub
12  End If
13  
14  Dim day As Date
15  day = CDate(dayStr)
16   
17  Dim nextMonthFirstDay As Date
18  nextMonthFirstDay = DateAdd("m", 1, day)
19  nextMonthFirstDay = CDate(Format(nextMonthFirstDay, "yyyy/mm/") & "1")
20  
21  Dim lastDay As Date
22  lastDay = DateAdd("d", -1, nextMonthFirstDay)
23  
24  MsgBox Format(day, "yyyy/mm") & "月の末日は" & Format(lastDay, "d") & "日です。"
25  
26End Sub

コードの解説

1dayStr = InputBox("日付をyyyy/m、またはyyyy/m/dの形式で入力してください。")

Inputboxに入力された値がString型でdayStrに代入されます。

1If dayStr = "" Then
2  Exit Sub
3End If

Inputboxでキャンセルが押されたときは、空白がdaystrに代入されます。
キャンセルが押されたら処理を中止します。

1If IsDate(dayStr) = False Then
2  MsgBox "日付をyyyy/m、またはyyyy/m/dの形式で入力してください。", vbCritical
3  Exit Sub
4End If

dayStrが日付に変換できないときは、エラーとして処理を中止します。

1Dim day As Date
2day = CDate(dayStr)

CDate関数を使用して、daystrをDate型に変換してdayに代入します。

1Dim nextMonthFirstDay As Date
2nextMonthFirstDay = DateAdd("m", 1, day)
3nextMonthFirstDay = CDate(Format(nextMonthFirstDay, "yyyy/mm/") & "1")

DateAdd(“m”, 1, day)で入力された次月の日付を戻り値としてnextMonthFirstDayに代入します。
入力値2018/7/24 → 2018/8/24

CDate(Format(nextMonthFirstDay, “yyyy/mm/”) & “1”)で次月の1日を戻り値として取得しnextMonthFirstDayに代入します。
2018/8/24 → 2018/8/1

1lastDay = DateAdd("d", -1, nextMonthFirstDay)

DateAdd関数を使用して、次月1日の前日を取得します。
2018/8/1→2018/7/31

使用例

コードを実行するとインプットボックスが表示されます。
yyyy/mまたはyyyy/m/dの形式で入力します。例:2018/7, 2018/7/24

入力した月の末日が表示されます。

文字列など、日付として認識できないものを入力するとエラーになります。

関連ページ