我正在尝试设置一个函数,以便我传递一个空白单元格,或者甚至不为参数选择一个单元格,它返回我正在寻找的函数。这是我的代码:
Function FinancialsAge(FirstBirthday As Date, BeginningDate As Date, Optional SecondBirthday As Variant) As String
If IsMissing(SecondBirthday) = True Or SecondBirthday = vbNullString Then
FinancialsAge = Year(BeginningDate - FirstBirthday) - 1900
ElseIf SecondBirthday Then
FinancialsAge = (Year(BeginningDate - FirstBirthday) - 1900) & "/" & (Year(BeginningDate - SecondBirthday) - 1900)
End If
End Function
只要我为第三个参数选择一个空白单元格,这段代码就可以正常工作,但是当我离开第三个参数时,我得到一个“#Value!”单元格中的错误。无论如何要在Excel VBA中执行此操作,以便该功能在两种情况下都能正常工作?
谢谢,
答案 0 :(得分:2)
我认为这就像添加默认值一样简单:
Function FinancialsAge(FirstBirthday As Date, BeginningDate As Date, Optional _
SecondBirthday As Variant = vbNullString) As String
您还可以删除IsMissing(SecondBirthday) = True Or
以及
答案 1 :(得分:0)
你应该尝试一些错误捕获(只是检查一个单一事件对于一个TRUE语句是好的,但总有一个你可能没想到的随机事件会给你一个FALSE / ERROR语句。我不是确定您可以找到的所有输入,但函数的空可选变量会产生448错误。尝试考虑错误的不同值(包括文本,负值和非日期,看看错误值是什么。)
On Error Resume Next
If Err.Number <> 448 Then '"OPTIONAL" value is not present
FinancialsAge = Year(BeginningDate - FirstBirthday) - 1900
ElseIf Len(SecondBirthday) > 0 Then
FinancialsAge = (Year(BeginningDate - FirstBirthday) - 1900) & "/" & (Year(BeginningDate - SecondBirthday) - 1900)
End If
On Error GoTo 0
答案 2 :(得分:0)
我认为@ Simon1979的回答有点朝着正确的方向发展,但我会更进一步说,如果你知道你希望SecondBirthday
成为约会(而不是其他数据类型),那么你应该将其声明为Date
,而不是Variant
。 Variant为意外的输入数据类型(如字符串,对象等)打开了大门,然后你必须添加笨拙的错误处理代码来处理这些。
我会这样做:
Private Const NullDate As Date = -657434 ' 1 Jan 100 -- a date you will never use
Function FinancialsAge(FirstBirthday As Date, BeginningDate As Date, _
Optional SecondBirthday As Date = NullDate) As String
If SecondBirthday = NullDate Then
'Presumably no SecondBirthday was specified by the user.
FinancialsAge = Year(BeginningDate - FirstBirthday) - 1900
Else
FinancialsAge = (Year(BeginningDate - FirstBirthday) - 1900) _
& "/" & (Year(BeginningDate - SecondBirthday) - 1900)
End If
End Function
现在唯一“不干净”的事情是NullDate
常量的任意选择值,原则上可能会与合法的SecondBirthday
输入值发生冲突。但除非你正在研究古罗马帝国的财政状况,否则我给出的榜样应该没问题。如果你是,那么在遥远的未来选择一些东西,例如2958465,即999年12月31日。
无论哪种方式,这都不如使用可能导致如上所述的多个问题的Variant“不洁净”。