Dim Result() As Variant
在我的監視窗口,這似乎是如何檢查變量數組是否未分配?
Expression | Value | Type
Result | | Variant/Variant()
如何檢查以下內容:
if Result is nothing then
或
if Result is Not Set then
這基本上就是我想完成,但第一個不起作用,第二個不存在。
Dim Result() As Variant
在我的監視窗口,這似乎是如何檢查變量數組是否未分配?
Expression | Value | Type
Result | | Variant/Variant()
如何檢查以下內容:
if Result is nothing then
或
if Result is Not Set then
這基本上就是我想完成,但第一個不起作用,第二個不存在。
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更改值時」。
您可以使用即時窗口如下:
?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,如果該數組的大小,然後擦除。
檢查數組的LBound
。如果你得到一個錯誤,那麼它是未初始化的。
爲了避免錯誤處理,我用這個,看到的一個論壇很久以前,從那時起成功地應用於:
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
'Result'是一個數組。對於'ISNULL())的返回值','的IsEmpty('和'ISMISSING()'右尺寸後是'FALSE'。並且「Result Is Nothing」會引發錯誤。如果'Result'不是一個數組,我想你的答案會很好。 – Oneide 2011-03-30 01:48:02
@ OP2506 - 因爲結果不是一個對象,無非是將拋出一個錯誤。但是,在數組上調用Redim之前,IsEmpty將返回true。如果沒有傳遞給聲明爲'可選美孚作爲Variant'一個參數,它可以包括數組ISMISSING將返回true。 – Thomas 2011-03-30 03:02:53
@讓·弗朗索瓦·科比特 - 事實上,我做到了。但是,我注意到行爲上的差異。如果在模塊級別聲明Result(),然後在立即窗口中運行「IsEmpty(Result)」,則返回true。但是,如果將它放入例程並執行Debug.Print,則它將返回false。 – Thomas 2011-03-30 07:42:16