2013-08-28 57 views
1

我有一个函数可以找到下一个星期一的日期。当没有可选的日期参数传递时,它将变为默认值零。我想我已经包含注释来说明问题Excel VBA - 函数可选参数DATE类型失败

Function NextMondayFromADateOrToday(Optional StartDate As Date) As Date 
' objective: if date param not supplied should set StartDate to today 
' ??? Problem: with no arg provided StartDate is zero = date value of 1/1/1900 
' ??? how to add default to optional paramater of date type? 
' ??? or, how to check if an arg was provided if the parameter is date type? 
If Not (IsDate(StartDate)) Then StartDate = Date 
Select Case Weekday(StartDate) 
Case 1:  NextMondayFromADateOrToday = StartDate + 1 
Case 2:  NextMondayFromADateOrToday = StartDate + 0 
Case 3:  NextMondayFromADateOrToday = StartDate + 6 
Case 4:  NextMondayFromADateOrToday = StartDate + 5 
Case 5:  NextMondayFromADateOrToday = StartDate + 4 
Case 6:  NextMondayFromADateOrToday = StartDate + 3 
Case 7:  NextMondayFromADateOrToday = StartDate + 2 
End Select 
End Function 

回答

4

VBA变量一般有一个默认值或者用一个变体,以及任何可选参数都自动日期不能为空设置为其默认值,因此这种行为是预期的。既然你已经知道如果没有传递,可选参数将默认为0(1/1/1900),为什么不只是测试该值,而是测试一下是否传入日期?

另一方面,如果您认为有人可能需要通过1/1/1900,那么您应该将可选参数设置为Variant类型。变体在传递时不会初始化,因此它不会有默认值(与日期不同)。

+0

非常感谢。我希望有更优雅的东西,尤其是一种设定日期默认值的方法。但是你说的话很有道理,我已经尝试过并且工作得很好。非常感谢。 –

+0

很高兴工作。如果你想在没有日期通过时设置默认日期,你需要使用Variant,然后像ooo写的那样测试它'如果IsMissing(StartDate)Then ...'。无论您采用哪种答案,都不要忘记将其标记为已接受。 – techturtle

1

所以在这种情况下

Function NextMondayFromADateOrToday(Optional StartDate As Variant) As Date 
' objective: if date param not supplied should set StartDate to today 
' ??? Problem: with no arg provided StartDate is zero = date value of 1/1/1900 
' ??? how to add default to optional paramater of date type? 
' ??? or, how to check if an arg was provided if the parameter is date type? 
If IsMissing(StartDate) Then StartDate = Date 
Select Case Weekday(StartDate) 
Case 1:  NextMondayFromADateOrToday = StartDate + 1 
Case 2:  NextMondayFromADateOrToday = StartDate + 0 
Case 3:  NextMondayFromADateOrToday = StartDate + 6 
Case 4:  NextMondayFromADateOrToday = StartDate + 5 
Case 5:  NextMondayFromADateOrToday = StartDate + 4 
Case 6:  NextMondayFromADateOrToday = StartDate + 3 
Case 7:  NextMondayFromADateOrToday = StartDate + 2 
End Select 
End Function 
1

我知道有一个公认的答案,我是迟到了,但是......

也许提供了,在函数声明和测试默认日期:

Function NextMondayFromADateOrToday(Optional StartDate As Date = #12/31/1592#) As Date 
' objective: if date param not supplied should set StartDate to today 
' ??? Problem: with no arg provided StartDate is zero = date value of 1/1/1900 
' ??? how to add default to optional paramater of date type? 
' ??? or, how to check if an arg was provided if the parameter is date type? 
    If StartDate = #12/31/1592# Then 
    StartDate = Date 
    End If 
    'If Not (IsDate(StartDate)) Then StartDate = Date 
    Select Case Weekday(StartDate) 
    Case 1:  NextMondayFromADateOrToday = StartDate + 1 
    Case 2:  NextMondayFromADateOrToday = StartDate + 0 
    Case 3:  NextMondayFromADateOrToday = StartDate + 6 
    Case 4:  NextMondayFromADateOrToday = StartDate + 5 
    Case 5:  NextMondayFromADateOrToday = StartDate + 4 
    Case 6:  NextMondayFromADateOrToday = StartDate + 3 
    Case 7:  NextMondayFromADateOrToday = StartDate + 2 
    End Select 
End Function 

如果12/31/1592远远没有超出预期的范围,您可以更早或更晚,直到您开始达到日期所能处理的极限 - 快速测试显示Excel 2010可以采用日期#1/1/100#和#1/1/9999#