今日は、今月の第何週目?

指定日が、指定月の第何週目かを知る必要があった。
そこで、Excel のユーザー定義関数で求めてみることにした。
f:id:Infoment:20190227214326p:plain
今日は、2月27日。なので今日の日付を引数として、戻り値は、何週目かを表す数値にしよう。
f:id:Infoment:20190227214614p:plain

色々な方法があると思うが、私はこう考えた。

  1. カウンターを一つ準備する。
  2. カウンターの初期値は、1とする(指定日が日曜日の場合は0)。
  3. 指定月一日から1日ずつ加算し、日曜日を通過するたびにカウンターに1を加える。
  4. 指定日になった時点のカウンターを、戻り値とする。

例えば2月27日の場合、

  • 2/3
  • 2/10
  • 2/17
  • 2/24

で、4回日曜日を通過する。従って、今日は第5週目となるはずだ。

早速、コードに落とし込んでみよう。

Function WeekNumber(target_date As Date) As Long
    Dim cnt As Long
    Dim FirstDay As Date
        FirstDay = DateSerial(Year(target_date), Month(target_date), 1)
        
        ' 指定日が1日なら、第一週確定。
        If FirstDay = target_date Then
            WeekNumber = 1
            Exit Function
        End If
        
        Select Case WorksheetFunction.Weekday(FirstDay)
            Case vbSunday: cnt = 0
            Case Else: cnt = 1
        End Select
        
    Dim d As Date
        d = FirstDay
        Do
            d = d + 1
            If WorksheetFunction.Weekday(d) = vbSunday Then
                cnt = cnt + 1
            End If
            
            If d = target_date Then
                Exit Do
            End If
        Loop
        
        WeekNumber = cnt
End Function

よし、できた。
f:id:Infoment:20190227220400p:plain

ところで確認の際、何やら怪しいものが目に入ってきた。
f:id:Infoment:20190227220514p:plain

WEEKNUM関数?そんなもの知らんぞ。確認してみると、「その年の」何週目かが戻り値となる関数だとか。ということは・・・

Function WeekNumber(target_date As Date) As Long
    Dim FirstDay As Date
        FirstDay = DateSerial(Year(target_date), Month(target_date), 1)
        
        WeekNumber = WorksheetFunction.WeekNum(target_date) - _
                     WorksheetFunction.WeekNum(FirstDay) _
                     + 1
End Function

これで充分だった。

今日の教訓:良く調べてから行動しましょう。

参考まで。