定义可以带空参数的函数
Posted
技术标签:
【中文标题】定义可以带空参数的函数【英文标题】:Define function that can take null parameter 【发布时间】:2013-12-18 15:35:38 【问题描述】:我最近试图在 Excel 中重新定义 Access 的 Nz(Value, [ValueIfNull])
函数,因为我发现它非常有用,但它在 Excel 中却没有(因为我在移动一些有用的函数时感到失望)。 Access 的 Nz 函数检查 Value
- 如果此值为 null,则返回 ValueIfNull
(否则返回 Value
)。在 Access 中,它对于检查输入框的值很有用(以及其他几项):
If Nz(myTextBox.Value, "") = "" Then
MsgBox "You need to enter something!"
End If
滚动我自己的Nz
函数似乎并不困难:
Public Function Nz(value As Variant, Optional valueIfNull As Variant = "") As Variant
If IsNull(value) Then
Nz = valueIfNull
Else
Nz = value
End If
End Function
但是,一旦我尝试使用实际上为 null 的任何内容来调用它,Excel 就会在调用行(Run-time error '91': Object variable or With block not set
,我理解它与其他语言中的 NullReferenceException
大致等效)抱怨它,甚至在此之前进入 Nz 函数体。例如,Nz(someObj.Value, "")
仅在 someObj.Value
不为空时才有效(使函数完全没有实际意义)。
我在这里遗漏了 VBA 的一些细节吗?来自像 VB.NET 这样的语言,这似乎很令人困惑 - 我理解对象引用只是对驻留在内存中的实际对象的地址,因此传递引用(而不是对象)不应该引起问题(直到你尝试当然,实际上对不存在的对象做一些事情)。例如:
Dim myObj As SomeObject
SomeMethod(myObj) 'the call itself is fine
Public Sub SomeMethod(SomeObject obj)
myObj.DoSomething() 'but *here* it would crash
End Sub
如何在 VBA 中创建可以接受空参数的子函数和函数?
【问题讨论】:
快速说明:意识到我可以通过使用Iif
在Excel 中或多或少地复制Nz
,但问题是关于定义一般采用空参数而不是修复的函数对于那个特定情况 - 它恰好是一个有用的场景
您想使用变体还是对象?
【参考方案1】:
如果仍有不清楚的地方,请参阅 this
和 that
并尝试
Sub Main()
Dim obj As Range
Debug.Print Nz(obj)
Dim v As Variant
v = Null
Debug.Print Nz(v)
End Sub
Public Function Nz(value As Variant, Optional valueIfNull As Variant = "") As Variant
' deal with an object data type, vbObject = 9
If VarType(value) = vbObject Then
If value Is Nothing Then
Nz = valueIfNull
Else
Nz = value
End If
' deal with variant set to null, vbNull is a Variant set to null
ElseIf VarType(value) = vbNull Then
If IsNull(value) Then
Nz = valueIfNull
Else
Nz = value
End If
End If
End Function
【讨论】:
刚刚找到is Nothing
:) 打败我,但这应该是答案:)
+ 1 你今天火了 :)
很好的答案,也非常有用的链接。谢谢!
感谢这个非常有用的代码。我认为它需要在顶部再增加一行来处理默认情况,其中传入的值既不是对象也不等于 null。我把这行放在第一位:Nz = value以上是关于定义可以带空参数的函数的主要内容,如果未能解决你的问题,请参考以下文章