如何在VBA中将任何内容或空白单元格传递给Optional参数?

时间:2013-11-13 03:52:14

标签: excel vba excel-vba

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

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中执行此操作,以便该功能在两种情况下都能正常工作?

谢谢,

3 个答案:

答案 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“不洁净”。