我需要计算当前一周内的日期(例如2017/04/01),只考虑日期的那一天,这是否可以使用Excel VBA? 我看过这样的问题excel vba - How to get the Day Name of Date? 但他们回答了另一个问题。我也看过使用像vbTuesday这样的常量,但他们没有帮助,因为我仍然需要弄清楚如何将日期名称连接到当前周。
答案 0 :(得分:1)
主要问题是将您的日期名称变为日期编号 - 因此星期二或星期二返回第1天(星期一是第0天)。
首先想到我在VBA中使用Select Case
语句,但可能有更好的方法。
下面的代码将计算周一日期(dReturnDate
),然后根据您的要求添加一些天数。无意义的日期名称将返回#Num
错误。
Public Function DateFromDay(DayName As String) As Variant
Dim dReturnDate As Date
Dim lDayNumber As Long
dReturnDate = Date - Weekday(Date - 2)
Select Case DayName
Case "Mon", "Monday"
lDayNumber = 0
Case "Tue", "Tuesday"
lDayNumber = 1
Case "Wed", "Wednesday"
lDayNumber = 2
Case "Thu", "Thursday"
lDayNumber = 3
Case "Fri", "Friday"
lDayNumber = 4
Case "Sat", "Saturday"
lDayNumber = 5
Case "Sun", "Sunday"
lDayNumber = 6
Case Else
lDayNumber = -1
End Select
If lDayNumber >= 0 Then
DateFromDay = dReturnDate + lDayNumber
Else
DateFromDay = CVErr(xlErrNum)
End If
End Function
在工作表上:
=DateFromDay("Tuesday")
2017年4月18日返回
=DateFromDay("Any Day")
返回#Num!
答案 1 :(得分:1)
很大程度上取决于您是否要使用vbUseSystemDayOfWeek
,或者只是将星期一视为第1天是可以接受的。如果您想接受“Mon”和“Monday”,并且想要使用UCase
保护查找,还需要其他代码。
原则上,功能可以简单如下:
Public Function DateFromDayName(dayName As String) As Date
Dim d As Long
d = WorksheetFunction.Match(dayName, _
Array("Monday", _
"Tuesday", _
"Wednesday", _
"Thursday", _
"Friday", _
"Saturday", _
"Sunday"), _
0)
DateFromDayName = Now - Weekday(Now, vbMonday) + d
End Function