我有一个函数可以找到下周一的日期。如果没有传递可选的日期参数,则它将默认为零。我想我已经包含了解释问题的评论
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
答案 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#