查找给定月份的第一个星期一或上个月的最后一个星期一

问题描述 投票:0回答:4

如果该月的第一天是星期一至星期三,则第一个星期一是本周。

如果第一天是周四至周日,则第一个周一为下周一。

示例:

2021 年 8 月 - 第一个星期一为 02/08/2021,因为该月的第一天是星期日(即星期三之后)。

2021 年 9 月 - 第一个星期一为 30/08/2021,因为该月的第一天是星期三。

2021 年 10 月 - 第一个星期一为 04/10/2021,因为该月的第一天是星期五。

以下代码给出该月的第一个星期一。

Public Function FirstMonday(myDate As Date) As Date
    Dim d As Date, w As Long
    d = DateSerial(Year(myDate), month(myDate), 1)
    w = Weekday(d, vbMonday)
    FirstMonday = d + IIf(w <> 1, 8 - w, 0)
End Function
vba date weekday
4个回答
1
投票

为了分解你的问题,你真正要寻找的是该月第一个星期三之前的星期一

所以,只要找到第一个星期三,然后减去两天!!不需要使用

If ... Else 
语句使事情变得过于复杂。

Public Function FirstMonday(myDate As Date) As Date
    Dim d As Date, w As Long
    d = DateSerial(Year(myDate), Month(myDate), 1)

    w = Weekday(d, vbThursday)  'Thursday = 1, Friday = 2, Wednesday = 7
    d = d + 7 - w               'Adjusts d from being first day to first wednesday

    FirstMonday = d - 2         'The Monday before
End Function

0
投票

你很接近。对于您的测试日期,这给了我预期的回应:

Public Function FirstMonday(myDate As Date) As Date
   Dim d As Date, w As Long
   d = DateSerial(Year(myDate), Month(myDate), 1)
   w = Weekday(d, vbMonday)

   If w > 3 Then
       FirstMonday = d + (8 - w)
   Else
       FirstMonday = d - w + 1
   End If

End Function

w > 3
时,每月的第一天是周四到周日。在这种情况下,请将缺少的天数添加到下周一 (
8 - w
)。否则,向后退并减去
w - 1
即可到达前一周的星期一。


0
投票

尝试一下这个版本:

Public Function FirstMonday(myDate As Date) As Date
   Dim d As Date, w As Long
   d = DateSerial(Year(myDate), Month(myDate), 1)
   w = Weekday(d, vbMonday)
   If w >= 1 And w <= 3 Then d = d - 7
   FirstMonday = d + 8 - w
End Function

d
将保存该月第一天的日期
w
将获取该日期是星期几(星期一=1,星期日=7)
当星期几是星期一到星期三(
w
是 1..3)时,我们返回一周 (
d = d - 7
)。
根据该日期,我们计算下周一 (
d + 8 - w
)。

这是结果:

月初 第一个星期一
一月 2021 年 1 月 1 日星期五 2021 年 1 月 4 日星期一
二月 2021 年 2 月 1 日星期一 2021 年 2 月 1 日星期一
三月 2021 年 3 月 1 日星期一 2021 年 3 月 1 日星期一
四月 2021 年 4 月 1 日,星期四 2021 年 4 月 5 日星期一
五月 2021 年 5 月 1 日,星期六 2021 年 5 月 3 日星期一
六月 2021 年 6 月 1 日星期二 2021 年 5 月 31 日星期一
七月 2021 年 7 月 1 日,星期四 2021 年 7 月 5 日星期一
八月 2021 年 8 月 1 日,星期日 2021 年 8 月 2 日星期一
九月 2021 年 9 月 1 日,星期三 2021 年 8 月 30 日星期一
十月 2021 年 10 月 1 日星期五 2021 年 10 月 4 日星期一
十一月 2021 年 11 月 1 日星期一 2021 年 11 月 1 日星期一
十二月 2021 年 12 月 1 日,星期三 2021 年 11 月 29 日星期一

0
投票

我没有发现最后一个例子适用于所有日期。这是适用于所有日期的调整版本:

Public Function FirstMonday(myDate As Date)
Dim d As Date, w As Long
    d = DateSerial(Year(myDate), Month(myDate), 1)
    w = Weekday(d) ' Monday = 2
    Do Until w = 2
        d = d + 1
        w = Weekday(d)
    Loop
    ' now have first Monday for d
    FirstMonday = d
End Function
© www.soinside.com 2019 - 2024. All rights reserved.