如何在VBA中传递任何内容或空白单元格为可选参数?

我试图设置一个函数,以便我是否传递一个空白单元格或甚至不select一个单元格的参数它返回我正在寻找的函数。 这是我的代码:

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 

这个代码工作正常,只要我为第三个参数select一个空白单元格,但是当我离开第三个参数时,我得到一个“#Value!” 单元格中的错误。 无论如何要在Excel VBA中做到这一点,使该function在两种情况下工作?

谢谢,

我认为这与添加默认值一样简单:

 Function FinancialsAge(FirstBirthday As Date, BeginningDate As Date, Optional _ SecondBirthday As Variant = vbNullString) As String 

你也可以删除IsMissing(SecondBirthday) = True Or也可以

你应该尝试一些错误捕捉(只要检查单个事件对于TRUE语句来说是好的,但总会有随机事件你可能没有想到给你一个FALSE / ERROR语句,我不确定所有的input你可以find,但一个空的可选variables给一个函数给出一个448错误。试着想出你的错误的不同值(包括文本负值非date ,看看错误值是什么)。

 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 

我认为@ Simon1979的回答是正确的方向,但我会更进一步说,如果你知道你希望SecondBirthday是一个date(而不是其他数据types),那么你应该声明它是一个Date ,而不是一个Variant 。 Variant为意外的input数据types(比如Strings,Objects,等等)打开了大门,然后你必须添加尴尬的error handling代码来处理这些数据types。

我会这样做:

 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常量的价值的任意select,原则上可以与合法的SecondBirthdayinput值相冲突。 但是,除非你正在研究古罗马帝国的财政状况,否则我所举的例子应该没​​问题; 如果是的话 ,那就select一些遥远的未来,例如2958465即9999年12月31日。

无论哪种方式,这比使用可能导致如上所述的多个问题的变体更“不洁净”。