【问题标题】:VBA for week number of a month similar to desktop calendar类似于桌面日历的月份周数的 VBA
【发布时间】:2017-08-17 01:23:58
【问题描述】:

请您帮我添加特定月份的周数吗?

这是vba:

With Target
If .Column <> 10 Or .Row < 1 Then Exit Sub
If .Value = "Select" Then
    If .Offset(0, 1).Value = "" Then
        .Offset(0, 1).NumberFormat = "mm/dd/yy"
        .Offset(0, 1).Value = Now - 1      
    End If

我对周数的定义是基于从周日到周六的整周:

  1. 如果该月的第一天不是从星期日开始,则该月第一个星期六之前的任何日子都将是第 1 周

  2. 接下来的周日到周六将是第 2 周第 3 周第 4 周等。除非月份开始在星期日,在这种情况下,集合将是第 1 周第 2 周第 3 周等。

  3. 如果该月不是在星期六结束,那么星期天到月底将是 第 N+1 周,其中 N 是第 2 步给出的最后一周。

例如:本月的 3 月 1 日是星期三。所以 3 月 1 日至 4 日(周三至周六)将是 1 周,以此类推。

【问题讨论】:

    标签: excel week-number vba


    【解决方案1】:

    你可以试试看WeekNum函数是否适合你的目的。

    您可以像这样在代码中使用它:

    .Offset(0, 2).Value = WorksheetFunction.WeekNum(Now - 1)

    文档说:

    返回特定日期的周数。例如,包含 1 月 1 日的那一周是一年中的第一周,编号为第 1 周。

    有两个系统用于此功能:

    系统 1 包含 1 月 1 日的那一周是一年中的第一周,编号为第 1 周。

    系统 2 包含一年中第一个星期四的周是一年中的第一周,编号为第 1 周。该系统是 ISO 8601 中指定的方法,通常称为欧洲周编号系统。

    编辑

    OP 对周的定义是根据桌面日历,其中每个绿色块是一周 - 因此 2017 年 3 月有 5 周。注意 2016 年 1 月在此系统下有六周!

    因此,WeekNum 公式不会给出预期的结果。相反,可以使用以下函数:

    Function GetCalendarTypeMonthWeek(dt As Date) As String
    
        Dim lngDayOfMonth As Long
        Dim lngWeekDay As Long
        Dim dtFirstDayOfMonth As Date
        Dim lngFactor As Long
    
        lngDayOfMonth = Day(dt)
        lngWeekDay = Weekday(dt, vbSunday) '<~~ Sunday=1, Monday=2, etc
        
        'does month start on Sunday?
        dtFirstDayOfMonth = DateValue("01-" & Month(dt) & "-" & Year(dt))
        If Weekday(dtFirstDayOfMonth, vbSunday) = 1 Then
            lngFactor = 1
        Else
            lngFactor = 2
        End If
        
        'get calendar week number for date
        GetCalendarTypeMonthWeek = "Week " & CStr(Int((lngDayOfMonth - lngWeekDay) / 7) + lngFactor)
    
    End Function
    

    要在示例代码中使用,如:

    .Offset(0, 2).Value = GetMonthWeek(Now - 1)

    【讨论】:

    • 好的,但我需要每个月从 Wk1 到 Wk4 的周数。
    • 除闰年的二月外,月份有 4 周和额外的几天。例如,您将如何处理 1 月 29 日至 31 日?也许您可以用您对周数的定义来更新您的问题。
    • 没错,但正如你所说,即使它是一周中的一天,它也会被视为 WK4 或 WK5,具体取决于一个月中的周数。
    • 所以你的定义是第一个 7 天 = 第 1 周,第二个 7 天 = 第 2 周,第三个 7 天 = 第 3 周,第四个 7 天 = 第 4 周;剩余天数 = 第 5 周?
    • 那么如果 3 月 1 日是星期二,那么第 1 周就是 3 月 1 日到 3 月 5 日(星期六),那么这就是第 1 周,包括 5 天?
    【解决方案2】:

    我认为下一个函数会返回你想要的值:

    Function WeekOfTheMonth(DateRef As Date) As Integer
        Dim WeekFirstDayRefMonth As Integer
        WeekFirstDayRefMonth = Application.WeekNum(DateSerial(Year(DateRef), Month(DateRef), 1), 2)
        Dim WeekLastDayRefMonthB As Integer        
        WeekLastDayRefMonthB = Application.WeekNum(DateSerial(Year(DateRef), Month(DateRef), 1) - 1, 2)
        Select Case WeekFirstDayRefMonth - WeekLastDayRefMonthB
            Case 0: WeekOfTheMonth = Application.WeekNum(DateRef, 2) - WeekLastDayRefMonthB + 1
            Case 1: WeekOfTheMonth = Application.WeekNum(DateRef, 2) - WeekLastDayRefMonthB
            Case Else: WeekOfTheMonth = Application.WeekNum(DateRef, 2)
        End Select
    End Function
    

    只需在您的代码上写上WeekOfTheMonth("place your date here") 即可。 请注意:我没有检查此代码的所有场景,所以如果您得到意外结果,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多