Я работаю на надстройку 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)
в столбце Тип. После этого выполнение продолжается без сбоев, а в окне Debug отображается ожидаемое -1
.
Похоже, что отладчик смог правильно инициализировать пустой массив так, как мне нужно, чтобы показать его значение.
Я не думаю, что вы можете , AFAIK, вы можете удалить их, а затем поймать ошибки при попытке проверить их размер. Se here: http://stackoverflow.com/questions/206324/how-to-check-for-empty-array-in-vba-macro – RBarryYoung
@RBarryYoung: я могу выполнить проверку на стороне VBA, но COM-сервер является сторонним приложением, и они просто ожидают пустой массив. Я только что нашел обходное решение, которое работает только со строковыми массивами: 'Split (" ")'. Мне нужно общее решение для 'IAnything'. Это помогает вашей фантазии? – stenci
«Это помогает вашей фантазии?» «А? Извините, я не следую ..? – RBarryYoung