Excel VBA - 如果只提供日期名称,有没有办法在当周获取日期?

时间:2017-04-19 09:02:31

标签: excel-vba excel-2010 vba excel

我需要计算当前一周内的日期(例如2017/04/01),只考虑日期的那一天,这是否可以使用Excel VBA? 我看过这样的问题excel vba - How to get the Day Name of Date? 但他们回答了另一个问题。我也看过使用像vbTuesday这样的常量,但他们没有帮助,因为我仍然需要弄清楚如何将日期名称连接到当前周。

2 个答案:

答案 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