2011-03-30 73 views
4
Dim Result() As Variant 

在我的監視窗口,這似乎是如何檢查變量數組是否未分配?

Expression | Value | Type 
Result  |  | Variant/Variant() 

如何檢查以下內容:

if Result is nothing then 

if Result is Not Set then 

這基本上就是我想完成,但第一個不起作用,第二個不存在。

回答

4

Chip Pearson提出了一個有用的模塊,名爲modArraySupport,其中包含一些功能來測試這樣的事情。在你的情況下,你會想要使用IsArrayAllocated

Public Function IsArrayAllocated(Arr As Variant) As Boolean 

該函數返回TRUE或FALSE,指示指定的數組是否被分配(不爲空)。返回TRUE的 數組是一個靜態數組或動態,已使用Redim語句分配。如果該數組是一個動態數組,它返回FALSE, 尚未用ReDim調整大小,或者已用Erase語句取消分配。此功能基本上與 ArrayIsEmpty相反。例如,

Dim Result() As Variant 
Dim R As Boolean 
R = IsArrayAllocated(Result) ' returns false 
ReDim V(1 To 10) 
R = IsArrayAllocated(Result) ' returns true 

使用的技術是基本上以測試數組邊界(由@Tim威廉姆斯的建議),但具有一個額外的疑難雜症。

要在即時窗口中測試:

?IsArrayAllocated(Result) 

測試在監視窗口:有可能的方式來做到這一點;例如,在R並在「手錶種類」添加監視選擇「BREAK更改值時」。

8

您可以使用即時窗口如下:

?Result Is Nothing 
?IsNull(Result) 
?IsEmpty(Result) 
?IsMissing(Result) 

第一種是爲了保持完整性。由於結果不是對象,因此Result Is Nothing將引發錯誤。 Empty適用於尚未初始化的變體 ,包括尚未標註尺寸的數組。

(更新)在做了一些額外的檢查後,我發現IsEmpty永遠不會在只有一個異常的聲明數組(不論是否爲Redim'd)上返回true。我發現的唯一例外情況是數組在模塊級聲明,而不是公開的,然後只有當您在即時窗口中檢查它時。

Missing if for可選值傳遞給函數或子函數。雖然你不能聲明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 

順便說一下,應當注意,該程序(或張貼由Jean-弗朗索瓦庫Corbett)將返回false,如果該數組的大小,然後擦除。

+0

'Result'是一個數組。對於'ISNULL())的返回值','的IsEmpty('和'ISMISSING()'右尺寸後是'FALSE'。並且「Result Is Nothing」會引發錯誤。如果'Result'不是一個數組,我想你的答案會很好。 – Oneide 2011-03-30 01:48:02

+0

@ OP2506 - 因爲結果不是一個對象,無非是將拋出一個錯誤。但是,在數組上調用Redim之前,IsEmpty將返回true。如果沒有傳遞給聲明爲'可選美孚作爲Variant'一個參數,它可以包括數組ISMISSING將返回true。 – Thomas 2011-03-30 03:02:53

+0

@讓·弗朗索瓦·科比特 - 事實上,我做到了。但是,我注意到行爲上的差異。如果在模塊級別聲明Result(),然後在立即窗口中運行「IsEmpty(Result)」,則返回true。但是,如果將它放入例程並執行Debug.Print,則它將返回false。 – Thomas 2011-03-30 07:42:16

0

檢查數組的LBound。如果你得到一個錯誤,那麼它是未初始化的。

3

爲了避免錯誤處理,我用這個,看到的一個論壇很久以前,從那時起成功地應用於:

If (Not Not Result) <> 0 Then 'Means it is allocated 

或替代地

If (Not Not Result) = 0 Then 'Means it is not allocated 

我用這主要是爲了延長數組大小從未設置的陣列這種方式

'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