计算特定年份的总周数-ISO 8601-VBA访问
我又看到过几次这个问题,但似乎无法在我的VBA代码中修复它 我需要根据ISO 8601计算给定年份的总周数 当我使用datediff函数时:计算特定年份的总周数-ISO 8601-VBA访问,vba,date,ms-access,iso8601,Vba,Date,Ms Access,Iso8601,我又看到过几次这个问题,但似乎无法在我的VBA代码中修复它 我需要根据ISO 8601计算给定年份的总周数 当我使用datediff函数时:iNumWeeks=datediff(“ww”、“2015年1月1日”、“2015年12月31日”、vbMonday、vbFirstJan1)它返回52,而2015年有53周(ISO 8601) 我怎样才能做到这一点 如果您不介意使用自定义项,此代码将返回它。 =ISOWeekNum(“2015年12月31日”)或=ISOWeekNum(42369)返回53
iNumWeeks=datediff(“ww”、“2015年1月1日”、“2015年12月31日”、vbMonday、vbFirstJan1)
它返回52,而2015年有53周(ISO 8601)
我怎样才能做到这一点 如果您不介意使用自定义项,此代码将返回它。
=ISOWeekNum(“2015年12月31日”)或=ISOWeekNum(42369)返回53
'http://www.cpearson.com/excel/DateTimeVBA.htm
来自澳大利亚的Excel MVP约翰·格林。
公共函数ISOWeekNum(AnyDate为日期,可选,格式为变量)为整数
'格式:缺失或2然后返回周数,
'=2然后YYWW
'
今年是整数
Dim上一年开始日期
Dim ThisYears开始日期
Dim NextYearStart作为日期
将um作为整数
今年=年(任意日期)
ThisYearStart=YearStart(今年)
PreviousYearStart=YearStart(今年-1)
NextYearStart=YearStart(今年+1)
选择Case AnyDate
案例>=NextYearStart
ISOWeekNum=(AnyDate-NextYearStart)\7+1
平均值=年(任意日期)+1
案件从今年开始审理
ISOWeekNum=(AnyDate-PreviousYearStart)\7+1
年份(任意日期)-1
其他情况
ISOWeekNum=(任意日期-今年开始)\7+1
年份(任意日期)
结束选择
如果是missing(WhichFormat),则退出函数
如果WhichFormat=2,则
ISOWeekNum=CInt(格式(右(第2页),“00”)&_
格式(ISOWeekNum,“00”))
如果结束
端函数
公共函数YearStart(其中ear为整数)作为日期
将工作日设置为整数
新年日期
NewYear=DateSerial(WhichYear,1,1)
WeekDay=(NewYear-2)Mod 7'生成工作日索引,其中周一=0
如果工作日<4,则
YearStart=新年-工作日
其他的
YearStart=新年-工作日+7
如果结束
端函数
可在查询中用作:
从tbl_MyTable中选择DISTINCT dDate,ISOWeekNum(dDate)如果您不介意使用自定义项,此代码将返回它。
=ISOWeekNum(“2015年12月31日”)或=ISOWeekNum(42369)返回53
'http://www.cpearson.com/excel/DateTimeVBA.htm
来自澳大利亚的Excel MVP约翰·格林。
公共函数ISOWeekNum(AnyDate为日期,可选,格式为变量)为整数
'格式:缺失或2然后返回周数,
'=2然后YYWW
'
今年是整数
Dim上一年开始日期
Dim ThisYears开始日期
Dim NextYearStart作为日期
将um作为整数
今年=年(任意日期)
ThisYearStart=YearStart(今年)
PreviousYearStart=YearStart(今年-1)
NextYearStart=YearStart(今年+1)
选择Case AnyDate
案例>=NextYearStart
ISOWeekNum=(AnyDate-NextYearStart)\7+1
平均值=年(任意日期)+1
案件从今年开始审理
ISOWeekNum=(AnyDate-PreviousYearStart)\7+1
年份(任意日期)-1
其他情况
ISOWeekNum=(任意日期-今年开始)\7+1
年份(任意日期)
结束选择
如果是missing(WhichFormat),则退出函数
如果WhichFormat=2,则
ISOWeekNum=CInt(格式(右(第2页),“00”)&_
格式(ISOWeekNum,“00”))
如果结束
端函数
公共函数YearStart(其中ear为整数)作为日期
将工作日设置为整数
新年日期
NewYear=DateSerial(WhichYear,1,1)
WeekDay=(NewYear-2)Mod 7'生成工作日索引,其中周一=0
如果工作日<4,则
YearStart=新年-工作日
其他的
YearStart=新年-工作日+7
如果结束
端函数
可在查询中用作:
从tbl_MyTable中选择不同的dDate,ISOWeekNum(dDate)日期部分,您以前尝试过吗
iNumWeeks = DatePart("ww", CDate("31/12/2015"), vbMonday, vbFirstFourDays) '53
DatePart,您以前试过这个吗
iNumWeeks = DatePart("ww", CDate("31/12/2015"), vbMonday, vbFirstFourDays) '53
这里有一个简单的函数,可以为任何年份提供正确的结果:
Public Function ISO_WeekCount( _
ByVal datYear As Date) _
As Byte
' Calculates number of weeks in year of datYear according to the ISO 8601:1988 standard.
'
' May be freely used and distributed.
' 2001-06-26. Gustav Brock, Cactus Data ApS, CPH
Dim bytISO_Thursday As Byte
' No special error handling.
On Error Resume Next
bytISO_Thursday = Weekday(vbThursday, vbMonday)
datYear = DateSerial(Year(datYear), 12, 31)
' Subtract one week if datYear is in week no. 1 of next year.
datYear = DateAdd("ww", Weekday(datYear, vbMonday) < bytISO_Thursday, datYear)
ISO_WeekCount = DatePart("ww", datYear, vbMonday, vbFirstFourDays)
End Function
公共功能ISO_WeekCount(_
ByVal datYear As Date)_
作为字节
'根据ISO 8601:1988标准计算一年中的周数。
'
可以自由使用和分发。
' 2001-06-26. 古斯塔夫·布罗克,仙人掌数据ApS,CPH
Dim bytISO_周四作为字节
'没有特殊的错误处理。
出错时继续下一步
星期四=工作日(星期四、星期一)
datYear=DateSerial(年份(datYear),12,31)
'如果datYear在下一年的第1周,则减去一周。
datYear=DateAdd(“ww”,工作日(datYear,vbMonday)
这里有一个简单的函数,可以为任何年份提供正确的结果:
Public Function ISO_WeekCount( _
ByVal datYear As Date) _
As Byte
' Calculates number of weeks in year of datYear according to the ISO 8601:1988 standard.
'
' May be freely used and distributed.
' 2001-06-26. Gustav Brock, Cactus Data ApS, CPH
Dim bytISO_Thursday As Byte
' No special error handling.
On Error Resume Next
bytISO_Thursday = Weekday(vbThursday, vbMonday)
datYear = DateSerial(Year(datYear), 12, 31)
' Subtract one week if datYear is in week no. 1 of next year.
datYear = DateAdd("ww", Weekday(datYear, vbMonday) < bytISO_Thursday, datYear)
ISO_WeekCount = DatePart("ww", datYear, vbMonday, vbFirstFourDays)
End Function
公共功能ISO_WeekCount(_
ByVal datYear As Date)_
作为字节
'根据ISO 8601:1988标准计算一年中的周数。
'
可以自由使用和分发。
' 2001-06-26. 古斯塔夫·布罗克,仙人掌数据ApS,CPH
Dim bytISO_周四作为字节
'没有特殊的错误处理。
出错时继续下一步
星期四=工作日(星期四、星期一)
datYear=DateSerial(年份(datYear),12,31)
'如果datYear在下一年的第1周,则减去一周。
datYear=DateAdd(“ww”,工作日(datYear,vbMonday)
再次引用
12月28日总是一年中的最后一周
所以这真的很简单
Public Function WeeksInYear(lYear As Long) As Long
WeeksInYear = DatePart("ww", DateSerial(lYear, 12, 28), vbMonday, vbFirstFourDays)
End Function
再次引用
12月28日总是一年中的最后一周
所以这真的很简单
Public Function WeeksInYear(lYear As Long) As Long
WeeksInYear = DatePart("ww", DateSerial(lYear, 12, 28), vbMonday, vbFirstFourDays)
End Function
回答很好-需要将vbMonday更改为2,将vbFirstFourDays更改为2(我尝试时Access不喜欢任何其他方式)从tbl_MyTable中选择不同的dDate、DatePart(“ww”、[dDate],2,2)