0

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

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 中执行此操作,以便该函数在两种情况下都有效?

谢谢,

4

3 回答 3

2

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

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

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

于 2013-11-13T04:09:28.153 回答
0

我认为@Simon1979 的回答有点朝着正确的方向发展,但我会进一步说,如果你知道你想SecondBirthday成为一个日期(而不是其他一些数据类型),那么你应该将它声明为 a Date,而不是 a 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,即 9999 年 12 月 31 日。

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

于 2013-11-13T08:08:17.397 回答
0

您应该尝试一些错误捕获(仅检查单个事件对于 TRUE 语句来说很好,但总会有您可能没有想到的随机事件会给您一个 FALSE/ERROR 语句。我不确定所有您可以找到输入,但函数的空 OPTIONAL 变量会给出 448 错误。尝试为您的错误考虑不同的值(包括textnegative valuesnon-dates并查看错误值是什么)。

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
于 2013-11-13T04:30:12.020 回答