【EXCEL VBA】第1月曜日の日付を取得したい

仕事をしていると「第1月曜日に〇〇があるけど、今月だと何日だ?」なんてことはよくあると思います。タイトルは、第1月曜日となっていますが、第(X)(Y)曜日の日付を取得できるように、汎用化した関数を紹介します。

weekDayで解決する

weekDay関数は指定した日付の曜日番号を返却する関数です。曜日番号は以下になります。

定数説明
vbSunday1日曜日
vbMonday2月曜日
vbTuesday3火曜日
vbWednesday4水曜日
vbThursday5木曜日
vbFriday6金曜日
vbSaturday7土曜日

この関数を利用して、以下の手順で日付を算出します。

  • 「求めたい年月の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