4

今天是 2013 年 2 月 27 日,也就是星期三。我需要公式,它将返回上一个星期一的日期。这将是 (02/17/2013)

我需要这样才能在发送电子邮件的 vba 代码中使用文件名或电子邮件主题。

With oMail
     'Uncomment the line below to hard code a recipient
     .To = "myemail@email.com"
     'Uncomment the line below to hard code a subject
     .Subject = "Current Report"
     .Attachments.Add WB.FullName
    .Display
End With
4

4 回答 4

15
Public Function LastMonday(pdat As Date) As Date
    LastMonday = DateAdd("ww", -1, pdat - (Weekday(pdat, vbMonday) - 1))
End Function

Weekday(yourdate, vbMonday) 返回 1 表示周一,2 表示周二,等等。所以

pdat - (Weekday(pdat, vbMonday) - 1)

通过从过去的日期中减去 Weekday()-1 # 天数,将为我们提供最近的星期一。

DateAdd("ww", -1, ...)

从该日期减去一周。

LastMonday(cdate("2/27/13"))

返回 2/18/2013(星期一,不是 17 号)

于 2013-02-27T16:16:15.323 回答
2

计算 Weekday(Now()) 和 2(= 星期一的工作日)之间的差,然后加上 7。

于 2013-02-27T16:07:04.483 回答
1

丹的答案应该涵盖您在 VBA 中的需求

或在 Excel 工作表公式中,您可以执行以下操作:

    =TEXT(DateCell- (WEEKDAY(DateCell,2)-1),"dddd mmmm dd")

所以 DateCell 是一个包含您要查找上周一日期的日期的范围!

因此,如果您将 08/04/2012 放入 DateCell,那么该公式将在 4 月 2 日星期一重新运行!

(归功于 MrExcel.com 和 Google 搜索!)HTH Philip

于 2013-02-27T16:38:09.453 回答
0

为了使接受的答案的功能更加通用,一些小的更改可以让您指定一周中的哪一天,以及您想要它向后/向前多远。

Public Function LastDow(pdat As Date, dow as integer, _&
                optional weeksOffset = -1 as integer) As Date
    LastDow = DateAdd("ww", weeksOffset, pdat - (Weekday(pdat, dow) - 1))
End Function

有了这个函数,你可以得到,比如说,下周三:

dim myDt as date
dim nextWed as date
myDt = now()
// Get next Wednesday (dow = Wednesday, weeksOffset is +1
x = LastDow(myDt, vbWednesday, 1)

再次感谢原始解决方案作者(Dan Meltheus)。

于 2017-04-11T12:41:23.380 回答