功能VBA中的可选参数不起作用

时间:2014-12-04 16:13:25

标签: excel vba excel-vba

我有以下功能,在Excel单元格中,写为 =FACING_CHANGE(live, optimal, [override])

    Function FACING_CHANGE(live As Integer, opt As Integer, _
      Optional override As Range) As String

        If override.Value <> "" And IsNumeric(override.Value) = True Then
            opt = override.Value
        End If
        If live = opt Then
            FACING_CHANGE = "SAME " & live
        ElseIf live > opt And opt = 0 Then
            FACING_CHANGE = "DELETED"
        ElseIf live > opt And opt > 0 Then
            FACING_CHANGE = "DECREASED"
        ElseIf live < opt And live = 0 Then
            FACING_CHANGE = "ADDED"
        ElseIf live < opt And live > 0 Then
            FACING_CHANGE = "INCREASED"
        End If
    End Function

返回字符串结果。我在使用可选的override参数时遇到问题。它现在属于range类型,因为如果0override,则空格将返回integer,这是有效的。我需要它作为可选参数,因为在 大多数 中,但并非所有情况都会与第3个参数一起使用。

当我插入断点并逐步执行时,该函数会在第一个if语句(If override.Value...)处自动退出。以下是一些结果。任何帮助将不胜感激!

enter image description here

3 个答案:

答案 0 :(得分:6)

如果未指定Range可选参数,则您的功能会将其作为Nothing收到。

然后当这一行运行时:

If override.Value <> ""

我打赌VBA正在炸毁一个未设置的&#34;对象引用&#34;错误,因为您正在访问Nothing override Is Nothing的对象引用上的属性。

解决方法是在访问之前检查{{1}}是否正确。

答案 1 :(得分:2)

您只需要验证是否定义了覆盖范围对象。 试试这个:

Function FACING_CHANGE(live As Integer, opt As Integer, Optional override As Range) As String

    If Not override Is Nothing Then
        If override.Value <> "" And IsNumeric(override.Value) = True Then
            opt = override.Value
        End If
    End If
    If live = opt Then
        FACING_CHANGE = "SAME " & live
    ElseIf live > opt And opt = 0 Then
        FACING_CHANGE = "DELETED"
    ElseIf live > opt And opt > 0 Then
        FACING_CHANGE = "DECREASED"
    ElseIf live < opt And live = 0 Then
        FACING_CHANGE = "ADDED"
    ElseIf live < opt And live > 0 Then
        FACING_CHANGE = "INCREASED"
    End If
End Function

答案 2 :(得分:1)

@ vba4all.com在原始问题的评论中发布的链接非常有用。这是修改后的第一个if语句:

    If IsMissing(override) = False And VarType(override) = vbInteger Then
        If IsNumeric(override) = True Then opt = override
    End If

如果使用IsMissing()

,还要将可选参数更改为Variant