ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > 函数与公式 > 按ISO标准返回周(weeknum)6种方法 2010年10月12日更新

按ISO标准返回周(weeknum)6种方法 2010年10月12日更新

作者:绿色风 分类: 时间:2022-08-18 浏览:103
楼主
mxqchina
网上搜集整理,放到一起,作为社区的一个资料贴,方便大家以后使用,非原创。

看到大家对2011-1-1属于2010年第52周,还是2011年第一周。有所疑问。其实根据ISO标准,已有定论。

根据ISO标准:第一周开始于星期一;或者包含星期四的第一周。公式1:
  1. =1+INT((A2-DATE(YEAR(A2+4-WEEKDAY(A2+6)),1,5)+WEEKDAY(DATE(YEAR(A2+4-WEEKDAY(A2+6)),1,3)))/7)
公式2
  1. =INT((A2-DATE(YEAR(A2-WEEKDAY(A2-1)+4),1,3)+WEEKDAY(DATE(YEAR(A2-WEEKDAY(A2-1)+4),1,3))+5)/7)
VBA 方法1
  1. Public Function IsoWeekNumber(InDate As Date) As Long
  2.     IsoWeekNumber = DatePart("ww", InDate, vbMonday, vbFirstFourDays)
  3. End Function
可惜此方法有bug,具体见。如2009年12月29日,返回53,实际为第一周。



VBA 方法2
  1. Public Function IsoWeekNumber2(d1 As Date) As Integer
  2. ' Attributed to Daniel Maher
  3.     Dim d2 As Long
  4.     d2 = DateSerial(Year(d1 - Weekday(d1 - 1) + 4), 1, 3)
  5.     IsoWeekNumber2 = Int((d1 - d2 + Weekday(d2) + 5) / 7)
  6. End Function
VBA 方法3
  1. Function WeekNumber(InDate As Date) As Integer
  2.   Dim DayNo As Integer
  3.   Dim StartDays As Integer
  4.   Dim StopDays As Integer
  5.   Dim StartDay As Integer
  6.   Dim StopDay As Integer
  7.   Dim VNumber As Integer
  8.   Dim ThurFlag As Boolean

  9.   DayNo = Days(InDate)
  10.   StartDay = Weekday(DateSerial(Year(InDate), 1, 1)) - 1
  11.   StopDay = Weekday(DateSerial(Year(InDate), 12, 31)) - 1
  12.   ' Number of days belonging to first calendar week
  13.   StartDays = 7 - (StartDay - 1)
  14.   ' Number of days belonging to last calendar week
  15.   StopDays = 7 - (StopDay - 1)
  16.   ' Test to see if the year will have 53 weeks or not
  17.   If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
  18.   VNumber = (DayNo - StartDays - 4) / 7
  19.   ' If first week has 4 or more days, it will be calendar week 1
  20.   ' If first week has less than 4 days, it will belong to last year's
  21.   ' last calendar week
  22.   If StartDays >= 4 Then
  23.      WeekNumber = Fix(VNumber) + 2
  24.   Else
  25.      WeekNumber = Fix(VNumber) + 1
  26.   End If
  27.   ' Handle years whose last days will belong to coming year's first
  28.   ' calendar week
  29.   If WeekNumber > 52 And ThurFlag = False Then WeekNumber = 1
  30.   ' Handle years whose first days will belong to the last year's
  31.   ' last calendar week
  32.   If WeekNumber = 0 Then
  33.      WeekNumber = WeekNumber(DateSerial(Year(InDate) - 1, 12, 31))
  34.   End If
  35. End Function

  36. Function Days(DayNo As Date) As Integer
  37.   Days = DayNo - DateSerial(Year(DayNo), 1, 0)
  38. End Function
VBA 方法4
  1. Function WOY(MyDate As Date) As Integer    ' Week Of Year
  2.   WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
  3.   If WOY > 52 Then
  4.     If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then WOY = 1
  5.   End If
  6. End Function
增加根据年份返回ISO当年的第一天:
  1. =(YEAR(A2)&"-1-4")-MOD(YEAR(A2)&"-1-2",7)
只是搜集,其中含义不甚了解,大家一起讨论吧。
具体见附件。

首发excelhome,发现关注的人不多,放在这里。
weeknum iso 20101012.zip
2楼
surdawu
学习了。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap