功能可选参数DATE类型失败

时间:2013-08-28 20:51:22

标签: excel vba date parameters optional

我有一个函数可以找到下周一的日期。如果没有传递可选的日期参数,则它将默认为零。我想我已经包含了解释问题的评论

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

3 个答案:

答案 0 :(得分:4)

VBA变量通常具有默认值,并且任何可选参数都会自动设置为默认值,因此需要此行为。既然你已经知道可选参数默认为0(1/1/1900),如果没有通过,为什么不测试该值而不是测试是否传递日期?

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

答案 1 :(得分: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

答案 2 :(得分: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#