VBScript 中的 ISO 周数或 VBA

ISO week number in VBScript or VBA

如何在 VBScript 或 VBA 中获取某个日期的 ISO week number

首先,请注意:

  1. 报告第 周和周数很重要,因为日期的年份可能不同。
  2. 几个 Windows 组件包含 a bug 某些年份的最后一个星期一。

根据我的经验,最简单、最清晰和最可靠的计算方法是:

Sub WeekNum(someDate, isoWeekYear, isoWeekNumber, isoWeekDay)
  Dim nearestThursday
  isoWeekDay = WeekDay(someDate, vbMonday)
  nearestThursday = DateAdd("d", 4 - Int(isoWeekDay), someDate)
  isoWeekYear = Year(nearestThursday)
  isoWeekNumber = Int((nearestThursday - DateSerial(isoWeekYear, 1, 1)) / 7) + 1
End Sub

这也是 returns ISO 星期几,从 1 开始计算星期一。

在 A1 单元格中输入任何日期,然后 运行 以下代码...

Range("A2").FormulaR1C1 = "=INT((R1C-DATE(YEAR(R1C-WEEKDAY(R1C-1)+4),1,3)+WEEKDAY(DATE(YEAR(R1C-WEEKDAY(R1C-1)+4),1,3))+5)/7)"

可以通过DatePart()VBA函数获取:

    Sub IsoWeek()
    Dim isoWeekNum As Byte
    Dim myDate As Date
        myDate = DateValue("01-01-2022")
        isoWeekNum = DatePart("ww", myDate, vbMonday, vbFirstFourDays)
        If isoWeekNum > 52 Then ' Bug check (to avoid the bug with Mondays)
            If Format(myDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then isoWeekNum = 1
        End If
        Debug.Print isoWeekNum
    End Sub