VBAで翌月(次月)を取得するには
VBAで翌月を取得するには、いくつかの方法がありますが、簡単なのはDateSerial関数を利用する方法です。
DateSerial関数の詳細については「年月日の数値をDate型に変換する(DateSerial)」をご参照ください。
一般的に日付を扱う場合はDate型を使う場合と、文字列の日付をCDate関数でDate型にする場合の2通りがあるため、どちらの書き方についても後述のサンプルで記載しています。
DateSerial関数で翌月(次月)を取得する方法
DateSerial関数は年、月、日の3つの数値(数字ではなく数”値”)からDate型の値を返します。
DateSerial(2000, 12, 31)
であれば、2000/12/31 をDate型で返します。
また、日がその月の最終日を超えている場合は月に繰り越され、月が12を超えている場合は年に繰り越されます。
そのため、以下のように月と日に通常より大きな値を設定すると、
DateSerial(2000, 13, 32)
であれば、日と月が繰り越されて 2001/02/01 が返されます。
この特性を利用して、DateSerial関数で翌月を取得するには以下のような関数を用意します。
現在日付の翌月の月を取得する場合
1 2 3 4 5 6 7 8 9 10 11 12 |
Function GetNextMonth() Dim d As Date '// Date型変数 '// システム日時を保持 d = Now '// システム日時の翌月を取得(第二引数の月に翌月を意味する1を加算。日は1日固定。) d = DateSerial(Year(d), Month(d) + 1, 1) '// 翌月の月部分を返却 GetNextMonth = Month(d) End Function |
現在日付の翌月の日付を取得する場合
1 2 3 4 5 6 7 8 9 10 11 12 |
Function GetNextMonthDate() Dim d As Date '// Date型変数 '// システム日時を保持 d = Now '// システム日時の翌月を取得(第二引数の月に翌月を意味する1を加算。日は1日固定。) d = DateSerial(Year(d), Month(d) + 1, 1) '// 翌月の月部分を返却 GetNextMonthDate = d End Function |
Year関数やMonth関数の詳細については「VBAで年、月、日を取得する(Year、Month、Day)」をご参照ください。
使い方
上の2つの関数を呼び出すサンプルです。
1 2 3 4 5 6 7 8 9 10 |
Sub GetNextMonthTest() Dim dMonth '// 月 Dim dDate '// 日付 dMonth = GetNextMonth Debug.Print dMonth '// 翌月の月を返す(1から12のいずれか) dDate = GetNextMonthDate Debug.Print dDate '// 翌月1日を返す(2023/06/01 など) End Sub |
現在が2023/5/29であれば、GetNextMonthは「6」を返し、GetNextMonthDateは「2023/06/01」を返します。
任意の日付の翌月を取得する方法
任意の日付の翌月の月を取得する場合は、上記の関数の現在日付の部分を任意の日付を受け取る引数に変更する形にすればOKです。返却値はDateSerial関数の結果にMonth関数で月の数値を返します。
1 2 3 4 5 6 7 8 9 |
Function GetMonthAfterSpecifiedMDate(dBase As Date) Dim d As Date '// 日付 '// 引数日付の翌月を取得(第二引数の月に翌月を意味する1を加算。日は1日固定。) d = DateSerial(Year(dBase), Month(dBase) + 1, 1) '// 翌月の月を返却 GetMonthAfterSpecifiedMDate = Month(d) End Function |
翌月1日を取得する場合は、DateSerial関数の結果をそのまま返します。
1 2 3 4 5 6 7 8 9 |
Function GetDateAfterSpecifiedDate(dBase As Date) Dim d As Date '// 日付 '// 引数日付の翌月を取得(第二引数の月に翌月を意味する1を加算。日は1日固定。) d = DateSerial(Year(dBase), Month(dBase) + 1, 1) '// 翌月1日の日付を返却 GetDateAfterSpecifiedDate = d End Function |
使い方は以下のようになります。日付文字列からDate型への変換にはCDate関数を利用しています。
CDateについての詳細は「VBAの型変換関数(キャスト)」をご参照ください。
あとは先に紹介した関数と同じですが、呼び出す関数の引数にDate型の任意の日付を渡します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub GetMonthAfterSpecifiedDateTest() Dim s As String '// 日付文字列 Dim d As Date '// 日付文字列のDate型 Dim iMonth As Integer '// 翌月の月 Dim dNext As Date '// 翌月日付 '// 日付文字列 s = "2023/5/29" '// 日付文字列をDate型に変換 d = CDate(s) '// 翌月を取得 iMonth = GetMonthAfterSpecifiedMDate(d) Debug.Print iMonth '// 翌月1日の日付を取得 dNext = GetDateAfterSpecifiedDate(d) Debug.Print dNext End Sub |
実行結果:
6 ・・・ 2023/5/29の翌月の6
2023/06/01 ・・・ 2023/5/29の翌月1日の日付