Dim Result() As Variant
Run Code Online (Sandbox Code Playgroud)
在我的观察窗口中,显示为
Expression | Value | Type
Result | | Variant/Variant()
Run Code Online (Sandbox Code Playgroud)
我如何检查以下内容:
if Result is nothing then
Run Code Online (Sandbox Code Playgroud)
要么
if Result is Not Set then
Run Code Online (Sandbox Code Playgroud)
这基本上是我想要完成的,但第一个不起作用,第二个不存在.
Ran*_*der 21
为了避免错误处理,我使用了这个,很久以前在论坛上看到并且从那时起成功使用:
If (Not Not Result) <> 0 Then 'Means it is allocated
Run Code Online (Sandbox Code Playgroud)
或者
If (Not Not Result) = 0 Then 'Means it is not allocated
Run Code Online (Sandbox Code Playgroud)
我用这个主要是通过这种方式从unset数组扩展数组大小
'Declare array
Dim arrIndex() As Variant
'Extend array
If (Not Not Result) = 0 Then
ReDim Preserve Result(0 To 0)
Else
ReDim Preserve Result(0 To UBound(Result) + 1)
End If
Run Code Online (Sandbox Code Playgroud)
Tho*_*mas 11
您可以在即时窗口中使用以下内容:
?Result Is Nothing
?IsNull( Result )
?IsEmpty( Result )
?IsMissing( Result )
Run Code Online (Sandbox Code Playgroud)
第一个是完整性.由于Result不是对象,因此Result Is Nothing会抛出错误.Empty适用于尚未初始化的变体,包括尚未标注尺寸的阵列..
(更新)在进行一些额外的检查时,我发现IsEmpty永远不会在声明的数组(无论是否Redim)上返回true,只有一个例外.我找到的唯一例外是当数组在模块级别而不是Public时声明,然后只在你在立即窗口中检查它时.
Missingif是否为传递给函数或子的可选值.虽然你不能声明Optional Foo() As Variant,但你可能会遇到类似ParamArray Foo() As Variant的情况,如果没有传递,IsMissing则会返回true.
因此,确定数组是否已初始化的唯一方法是编写一个检查以下内容的过程:
Public Function IsDimensioned(vValue As Variant) As Boolean
On Error Resume Next
If Not IsArray(vValue) Then Exit Function
Dim i As Integer
i = UBound(Bar)
IsDimensioned = Err.Number = 0
End Function
Run Code Online (Sandbox Code Playgroud)
顺便说一下,应该注意的是,如果对数组进行尺寸标注然后擦除,则此例程(或由Jean-FrançoisCorbett发布的库)将返回false.
Chip Pearson创建了一个名为modArraySupport的有用模块,它包含一系列函数来测试这样的事情.在您的情况下,您会想要使用IsArrayAllocated.
Public Function IsArrayAllocated(Arr As Variant) As Boolean
Run Code Online (Sandbox Code Playgroud)
此函数返回TRUE或FALSE,指示是否已分配指定的数组(非空).返回数组的TRUE是静态数组或已使用Redim语句分配的动态数据.如果数组是尚未使用ReDim调整大小或已使用Erase语句释放的动态数组,则返回FALSE.该函数基本上与ArrayIsEmpty相反.例如,
Dim Result() As Variant
Dim R As Boolean
R = IsArrayAllocated(Result) ' returns false
ReDim V(1 To 10)
R = IsArrayAllocated(Result) ' returns true
Run Code Online (Sandbox Code Playgroud)
使用的技术基本上是测试数组边界(由@Tim Williams建议)但是有额外的问题.
要在您的即时窗口中进行测试:
?IsArrayAllocated(Result)
Run Code Online (Sandbox Code Playgroud)
Watch窗口中的测试:有很多方法可以做到这一点; 例如,R在"Watch Type" 上添加一个手表,选择"Break When Value Changes".