VBA如何处理可能返回Integer或Nothing的函数结果赋值问题
问题原因
VBA中Set关键字仅用于对象类型赋值,Nothing是专属对象的空引用标识,而Integer属于值类型,既不能用Set赋值,也不能直接和Nothing做等值判断,你遇到的报错本质是函数混用了对象和值两种返回类型,不符合VBA的语法规则。
解决方案
方案1:兼容现有函数无需修改源码
如果无法改动GetTheNumber的逻辑,可以通过错误捕获兼容两种返回情况:
Dim someNumber As Variant Dim myIntegerNumber As Integer Dim assignSucceed As Boolean On Error Resume Next ' 先尝试值类型赋值 someNumber = GetTheNumber("Seven") assignSucceed = (Err.Number = 0) Err.Clear On Error GoTo 0 If Not assignSucceed Then ' 赋值失败说明返回了Nothing,标记为空 someNumber = Empty End If ' 后续业务逻辑 If IsEmpty(someNumber) Then ' 操作未完成的处理代码 Else If someNumber = 5 Then myIntegerNumber = someNumber End If End If
方案2:优化函数设计(更推荐)
混用返回类型的设计本身就容易引发类型错误,建议调整函数逻辑,用更符合VBA规范的方式标识操作状态,有两种常见实现:
实现A:返回Variant类型,用Empty标识失败
修改GetTheNumber,成功返回Integer数值,失败返回Empty:
Function GetTheNumber(ByVal key As String) As Variant ' 原有业务逻辑 If 操作成功 Then GetTheNumber = 7 ' 替换为实际计算出的数值 Else GetTheNumber = Empty End If End Function
调用时直接用IsEmpty判断即可,不需要处理错误:
Dim someNumber As Variant Dim myIntegerNumber As Integer someNumber = GetTheNumber("Seven") If IsEmpty(someNumber) Then ' 操作未完成处理 Else If someNumber = 5 Then myIntegerNumber = someNumber End If
实现B:返回Boolean标识成功,值放在传址参数
这是VBA处理这类场景的最佳实践,完全避免空值混淆问题:
' 函数定义 Function TryGetTheNumber(ByVal key As String, ByRef outNumber As Integer) As Boolean ' 原有业务逻辑 If 操作成功 Then outNumber = 7 ' 替换为实际计算出的数值 TryGetTheNumber = True Else TryGetTheNumber = False End If End Function
调用逻辑非常清晰:
Dim myIntegerNumber As Integer If TryGetTheNumber("Seven", myIntegerNumber) Then ' 操作成功,myIntegerNumber已拿到正确值 If myIntegerNumber = 5 Then ' 对应业务逻辑 End If Else ' 操作未完成处理 End If
内容的提问来源于stack exchange,提问作者NibblyPig
相关产品推荐
相关产品推荐

