我有以下功能,在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
类型,因为如果0
是override
,则空格将返回integer
,这是有效的。我需要它作为可选参数,因为在 大多数 中,但并非所有情况都会与第3个参数一起使用。
当我插入断点并逐步执行时,该函数会在第一个if语句(If override.Value...
)处自动退出。以下是一些结果。任何帮助将不胜感激!
答案 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