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 

它返回一个string结果。 我遇到了可选的override参数问题。 它的typesrange现在是因为如果override是一个integer ,这是有效的空白单元格返回0 。 我需要它作为一个可选的参数,因为在大多数情况下,但不是所有的情况下,它将与第三个参数一起使用。

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

在这里输入图像描述

当你的Range可选参数没有被指定时,你的函数接收它为Nothing

那么当这条线路运行时:

 If override.Value <> "" 

我敢打赌,VBA爆炸了一个“对象引用未设置”的错误,因为你正在访问一个对象引用Nothing属性。

解决scheme是在访问之前检查override Is Nothing

您只需要validation是否定义覆盖范围对象。 尝试这个:

 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 

在@ vba4all.com的原始问题下的评论中发布的链接真的很有帮助。 这是修改的第一条if语句:

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

如果使用IsMissing(),也将可选参数更改为Variant