Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算特定年份的总周数-ISO 8601-VBA访问_Vba_Date_Ms Access_Iso8601 - Fatal编程技术网

计算特定年份的总周数-ISO 8601-VBA访问

计算特定年份的总周数-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

我又看到过几次这个问题,但似乎无法在我的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

'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)