我工作的一個Excel VBA加載項與COM服務器交換對象,像這樣:如何在VBA中清空數組?
'get an array of objects
Dim Ents() As ISomething
ComObject.GetEntities Ents
'send an array with 10 objects
ReDim Ents(9)
Set Ents(0) = ...
...
ComObject.SetEntities Ents
獲取陣列效果很好:如果數組包含它按預期工作目標,如果數組空然後UBound(Ents) = -1
和一切按預期工作。
發送陣列僅適用於不爲空數組,因爲我不能Redim Ents(-1)
,並Erase
荷蘭國際集團的陣列VBA和COM服務器崩潰:Debug.Print UBound(Ents)
崩潰的VBA,誰知道崩潰的服務器。
它看起來像Erase
語句留下數組未定義/損壞而不是空的。
EDIT(澄清以下評論):
執行此代碼崩潰,因爲它不能計算UBound
:
Sub Test()
Dim Ents() As ISmartId
Debug.Print UBound(Ents)
End Sub
但是如果你添加Ents
到監視窗口,然後設置一個到Debug.Print
行的中斷點並執行,調試器在類型列中顯示ISmartId(0 to -1)
。在此之後,執行繼續而不發生崩潰,並且「調試」窗口顯示預期的-1
。
它看起來像調試器能夠以我需要的方式正確初始化空數組,只是爲了顯示其值。
我不認爲你可以。 AFAIK,你只能擦除它們,然後在你嘗試測試它們的大小時捕捉錯誤。在這裏:http://stackoverflow.com/questions/206324/how-to-check-for-empty-array-in-vba-macro – RBarryYoung
@RBarryYoung:我可以在VBA端進行檢查,但COM服務器是第三方應用程序,他們只是期望一個空數組。我只找到了一個只適用於字符串數組的解決方法:'Split(「」)'。我需要一個'IAnything'的通用解決方案。這是否有助於你的幻想? – stenci
「*這是否有助於您的幻想?*」咦?對不起,我沒有關注..? – RBarryYoung