【问题标题】:Get dates of Mon-Fri of previous week获取前一周周一至周五的日期
【发布时间】:2017-09-16 00:15:36
【问题描述】:

我正在尝试实施this SO answer 来获取前一周的周一至周五的日期,并使用以下代码进行测试:

Public Sub listPreviousWeekDays()

Dim dayCtr As Long

For dayCtr = 2 To 6
    Debug.Print DateAdd("ww", -1, Now - (Weekday(Now, dayCtr) - 1))
Next

End Sub

但是,这给出了:

4/10/2017 9:27:18 AM 
4/11/2017 9:27:18 AM 
4/12/2017 9:27:18 AM 
4/6/2017 9:27:18 AM 
4/7/2017 9:27:18 AM 

我的目标是让它回归:

4/10/2017 9:27:18 AM 
4/11/2017 9:27:18 AM 
4/12/2017 9:27:18 AM 
4/13/2017 9:27:18 AM 
4/14/2017 9:27:18 AM 

编辑:为避免XY problem,我将解释我要做什么:我想运行一个宏,用前一周的周一至周五日期填充单元格块。

【问题讨论】:

    标签: vba excel date weekday


    【解决方案1】:

    这应该可以解决问题。

    Public Sub listPreviousWeekDays()
    
    Dim dayCtr As Long
    For dayCtr = 2 To 6
    Debug.Print DateAdd("ww", -1, Now - (Weekday(Now, vbUseSystemDayOfWeek)) + dayCtr)
    Next
    
    End Sub
    

    【讨论】:

    • 您是否尝试按升序获取输出
    • 看来 OP 的代码和您的代码将返回上周的周一至周三,以及 前一周的周四和周五。我相信 OP 正试图在上周获得所有日期,而不是分散在两周内。
    • @cxw,这是正确的。我想获取前一周的周一至周五日期。
    • @PraveenRKaruppannan,这与 cxw 的解决方案有相同的问题:如果它在星期日运行,它会给出 2 周前的日期而不是上周。如果你用"4/16/2017" 代替Now 你可以复制这个问题。
    【解决方案2】:

    更新

    正如 OP 所指出的,当开始日期是星期日时,链接代码不适用于此特定用例。这是一个修复:

    Option Explicit   ' always always always use this
    
    Public Function MondayLastWeek(pdat As Date) As Date
        Dim weekday_increment As Long
        weekday_increment = weekday(pdat, vbMonday) - 1
        MondayLastWeek = DateAdd("ww", IIf(weekday_increment = 6, 0, -1), pdat - weekday_increment)
        ' IIf: if we're on Sunday, pdat-weekday_increment is already the date we want.
    End Function
    
    Public Sub listPreviousWeekDays()
        Dim monday As Date
        monday = MondayLastWeek(Now)
    
        Dim dayCtr As Long
        For dayCtr = 0 To 4
            Debug.Print monday + dayCtr
        Next
    End Sub
    

    原答案

    这对我有用:

    Public Sub listPreviousWeekDays()
    
        ' First, get last week's Monday just as in the linked question    
        Dim LastMonday As Date
        LastMonday = DateAdd("ww", -1, Now - (Weekday(Now, vbMonday) - 1))
    
        ' Then, loop over the rest of the week.
        ' Monday + 0 days => Monday
        ' Monday + 4 days => Friday
        Dim dayCtr As Long
        For dayCtr = 0 To 4
            Debug.Print LastMonday + dayCtr
        Next
    
    End Sub
    

    输出:

    4/10/2017 12:38:17 PM 
    4/11/2017 12:38:17 PM 
    4/12/2017 12:38:17 PM 
    4/13/2017 12:38:17 PM 
    4/14/2017 12:38:17 PM 
    

    我认为问题在于Weekday 的第二个参数没有指定您想要的哪一天。相反,它指定一周中的哪一天是工作日编号 1 (some documentation)。不要乱用Weekday,只需使用linked answer 获取星期一,然后根据需要添加日期。

    【讨论】:

    • 如果我在星期天运行链接的答案,我会从两周前得到星期一。试试lastMonday("4/16/2017"),你就会明白我的意思了。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多