VBA中vbWednesday异常:获取本周周四日期返回上周值咨询
分析VBA获取本周周四异常返回上周四的问题
这个坑我之前踩过!大概率是**Weekday函数的基准周定义**和你预期的“本周”不匹配,再加上计算逻辑没处理临界情况导致的,咱们一步步拆解:
核心问题:Weekday(Date, vbWednesday)的返回值逻辑
当你用vbWednesday作为一周的起始时,VBA对一周的划分是周三到下周二,且每天对应的返回值是:
- 周三 → 1
- 周四 → 2
- 周五 → 3
- 周六 → 4
- 周日 → 5
- 周一 → 6
- 周二 → 7
如果你的代码是类似下面这种简单的差值计算,就会在特定日期出错:
' 错误示例:当今天是周一/周二时,会返回上周四 Dim thisThursday As Date thisThursday = Date + (4 - Weekday(Date, vbWednesday))
比如今天是周二,Weekday(Date, vbWednesday)返回7,4-7=-3,相当于日期减3天,自然就跳到上周四了。
两种常见的修正方向
1. 如果你要的是「以周三为起始的本周周四」(周三到下周二区间内的周四)
修正计算逻辑,当差值为负时自动补7天,确保落在当前周区间:
Function GetThisThursday_WeekStartsWed() As Date Dim targetDay As Integer ' 周四在周三起始周里是第2天 targetDay = 2 Dim currentWeekPos As Integer currentWeekPos = Weekday(Date, vbWednesday) Dim dayDiff As Integer dayDiff = targetDay - currentWeekPos ' 如果当前日期在周四之后(差值为负),补7天回到当前周的周四 If dayDiff < 0 Then dayDiff = dayDiff + 7 End If GetThisThursday_WeekStartsWed = Date + dayDiff End Function
2. 如果你要的是「自然周的周四」(比如周一到周日/周日到周六的本周)
那用vbWednesday作为基准就完全错了,应该改成对应自然周的起始日:
- 若自然周是周一到周日,用
vbMonday作为基准:Function GetThisThursday_NaturalWeek() As Date ' 周一为起始,周四是第4天 Dim targetDay As Integer: targetDay = 4 Dim currentWeekPos As Integer: currentWeekPos = Weekday(Date, vbMonday) Dim dayDiff As Integer: dayDiff = targetDay - currentWeekPos If dayDiff < 0 Then dayDiff = dayDiff + 7 GetThisThursday_NaturalWeek = Date + dayDiff End Function
为什么之前正常?
之前运行正常是因为你执行代码的日期大概率在周三到周日之间:此时currentWeekPos是1-5,targetDay - currentWeekPos的结果是正或0,加日期后就能得到正确的本周周四。而这周你刚好在周一/周二执行,触发了差值为负的错误逻辑,就返回了上周四。
内容的提问来源于stack exchange,提问作者The Gootch
相关产品推荐
相关产品推荐

