Option Explicit
Public Function NthWeekday(Position, DayIndex As Long, TargetMonth As Long, Optional TargetYear As Long)
Dim FirstDate As Date
If DayIndex < 1 Or DayIndex > 7 Then
NthWeekday = CVErr(xlErrValue)
Exit Function
End If
If TargetYear = 0 Then TargetYear = Year(Now)
Select Case Position
Case 1, 2, 3, 4, 5, "L", "l"
FirstDate = DateSerial(TargetYear, TargetMonth, 1)
If Weekday(FirstDate, vbSunday) < DayIndex Then
FirstDate = FirstDate + (DayIndex - Weekday(FirstDate, vbSunday))
ElseIf Weekday(FirstDate, vbSunday) > DayIndex Then
FirstDate = FirstDate + (DayIndex + 7 - Weekday(FirstDate, vbSunday))
End If
If IsNumeric(Position) Then
NthWeekday = FirstDate + (Position - 1) * 7
If Month(NthWeekday) <> Month(FirstDate) Then NthWeekday = CVErr(xlErrValue)
Else
NthWeekday = FirstDate
Do Until Month(NthWeekday) <> Month(NthWeekday + 7)
NthWeekday = NthWeekday + 7
Loop
End If
Case Else
NthWeekday = CVErr(xlErrValue)
End Select
End Function
|