【问题标题】:VBA - Trying To Find First Monday Of Given MonthVBA - 试图找到给定月份的第一个星期一
【发布时间】:2021-10-23 02:19:30
【问题描述】:

我想弄清楚如何获得一个月的第一个星期一。我有以下代码可以给我每月的第一个星期一,但我需要确定第一个星期一是否在上个月内。如果该月的第一天是星期一到星期三,则第一个星期一是该周。如果第一天是周四到周日,那么第一个周一就是下周一。

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

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

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

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

可以提供任何很棒的帮助。

提前致谢,

乔诺

【问题讨论】:

  • 这能回答你的问题吗? First Monday of Current Month in VBA
  • 您可以在模块DateFind 中使用DateWeekdayInMonthFirst 中的通用函数VBA.Date
  • dim myFirstMonday as date --> Dim myFirstWednesday as date --> myDate = FirstMonday("01/10/2021") --> myFirstWednesday = dateAdd("d", 2, myFirstMonday)

标签: vba date


【解决方案1】:

试试这个版本:

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)。

这是结果:

Month First of Month First Monday
January Friday, January 01, 2021 Monday, January 04, 2021
February Monday, February 01, 2021 Monday, February 01, 2021
March Monday, March 01, 2021 Monday, March 01, 2021
April Thursday, April 01, 2021 Monday, April 05, 2021
May Saturday, May 01, 2021 Monday, May 03, 2021
June Tuesday, June 01, 2021 Monday, May 31, 2021
July Thursday, July 01, 2021 Monday, July 05, 2021
August Sunday, August 01, 2021 Monday, August 02, 2021
September Wednesday, September 01, 2021 Monday, August 30, 2021
October Friday, October 01, 2021 Monday, October 04, 2021
November Monday, November 01, 2021 Monday, November 01, 2021
December Wednesday, December 01, 2021 Monday, November 29, 2021

【讨论】:

    【解决方案2】:

    你很亲密。对于您的测试日期,这给了我预期的响应:

    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 &gt; 3 时,一个月的第一天是星期四到星期日。在这种情况下,将缺少的天数添加到下一个星期一 (8 - w)。否则,倒退并减去 w - 1 即可得到前一周的星期一。

    【讨论】:

      【解决方案3】:

      为了分解您的问题,您真正要查找的是每月第一个星期三之前的星期一

      所以,只要找到第一个星期三然后减去两天!!无需使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多