如何检查变量数组是否未分配?

jas*_*n m 12 vba variant

   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)

  • 这是您指的 [forumpost](http://www.vbforums.com/showthread.php?375341-Classic-VB-How-do-I-check-if-array-has-been-initialized)? (2认同)
  • 论坛帖子说:“对于任何感兴趣的人,Not Arrayname 揭示(或不揭示)指向 VB 用于定义数组的 SafeArray 结构的指针的反转。Not Not Arrayname 返回实际指针,如果数组未初始化,则返回 0。” (2认同)

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.


Jea*_*ett 9

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".