VBA表示一个月的周数类似于桌面日历

时间:2017-03-24 07:34:16

标签: excel-vba week-number vba excel

请你帮助我添加特定月份的周数?

这是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步给出的最后一周。

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

2 个答案:

答案 0 :(得分: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月在此系统下有六个星期!

enter image description here

因此,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)

答案 1 :(得分:0)

我认为下一个函数将返回您想要的值:

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"),就可以了。 请注意:我没有检查此代码的所有方案,所以如果您收到意外结果,请告诉我。