gpt4 book ai didi

vba - 定义可以带空参数的函数

转载 作者:行者123 更新时间:2023-12-02 04:33:16 30 4
gpt4 key购买 nike

我最近尝试在 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

但是,一旦我尝试使用任何实际上为空的内容来调用它,Excel就会在调用行上提示它(运行时错误'91':对象变量或With block 未设置,据我所知,它大致相当于其他语言中的 NullReferenceException ),甚至在到达 Nz 函数体之前。例如,Nz(someObj.Value, "") 仅当 someObj.Value 不为 null 时才有效(使该函数完全没有实际意义)。

我在这里遗漏了一些 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 中创建接受空参数的子函数和函数?

最佳答案

参见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

关于vba - 定义可以带空参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662226/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com