定义可以带空参数的函数

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】:

如果仍有不清楚的地方,请参阅 thisthat 并尝试

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

以上是关于定义可以带空参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

不带空值的 Oracle SQL 报告生成

VB6.0自定义函数中的参数问题

函数声明与定义之参数

函数相关知识汇总

函数定义传入二个参数,实际调用,也可以传一个参数.

andriod arcgis createPolygons创建带空的面