【发布时间】: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,但问题是关于定义一般采用空参数而不是修复的函数对于那个特定情况 - 它恰好是一个有用的场景 -
您想使用变体还是对象?