仕事をしていると「第1月曜日に〇〇があるけど、今月だと何日だ?」なんてことはよくあると思います。タイトルは、第1月曜日となっていますが、第(X)(Y)曜日の日付を取得できるように、汎用化した関数を紹介します。
weekDayで解決する
weekDay関数は指定した日付の曜日番号を返却する関数です。曜日番号は以下になります。
定数 | 値 | 説明 |
vbSunday | 1 | 日曜日 |
vbMonday | 2 | 月曜日 |
vbTuesday | 3 | 火曜日 |
vbWednesday | 4 | 水曜日 |
vbThursday | 5 | 木曜日 |
vbFriday | 6 | 金曜日 |
vbSaturday | 7 | 土曜日 |
この関数を利用して、以下の手順で日付を算出します。
- 「求めたい年月の1日の曜日番号」と「求めたい曜日番号」の差異を求める(α)
- 第(X)については、1週間は7日間なので、(X-1)を7倍した数(β)
- 求めたい年月の1日+α+βが、 第(X)(Y)曜日の日付 となる
サンプルプログラムを確認する(コピペOK)
Function getDateWeekNum(year As Integer, month As Integer, firstDayOfWeek As VbDayOfWeek, weekNum As Integer) As Date
' 求めたい年月の1日の曜日番号求める
Dim firstWeekday As Integer: firstWeekday = weekDay(DateSerial(year, month, 1))
' 1日の曜日番号と求めたい曜日番号の差分を求める
Dim diff As Integer: diff = (firstDayOfWeek + 7 - firstWeekday) Mod 7
' 目的の日付データを求めて返す
getDateWeekNum = DateSerial(year, month, 1 + diff + 7 * (weekNum - 1))
End Function
Sub sample()
Debug.Print getDateWeekNum(2019, 6, vbMonday, 1) ' 2019/06/03
Debug.Print getDateWeekNum(2019, 6, vbSunday, 2) ' 2019/06/09
Debug.Print getDateWeekNum(2019, 7, vbWednesday, 3) ' 2019/07/17
End Sub