Сначала надо подумать (надо было подумать), почему вообще возниает ошибка.
В VB (скажем, в COM а не в VB) верхняя и нижняя граница массива может быть произвольной.
LBound возвращает нижнюю (потому что L - Lower -нижний) границу, а
UBound - верхнюю (потому что U - Upper - верхний).
Для динамических массивов изначально ничего не определено (ни размерность, ни границы).
Судя по тому, что возникает ошибка, ReDim массиву SectionArr(3).ValuesS() никто никто не делал.
Поэтому не понятно, что ты ожидаешь получить от LBound и UBound, подсовывая им неопределённый массив.
Выходы:
1)
Изменить логику и хранить в Sect также поле ItemsCount As Long, в котором бы хранилось кол-во элементов в массиве ValuesS().
Индексацию ValuesS() начинать с 1.
Цикл перебора организовать так:
- Код: Выделить всё
For t = 1 To SectionArr(i).ItemsCount.
Таким образом, если там нет вообще элементов, то цикл вообще выполняться не станет (как и должно быть), а если 1 или 2 - выполнится столько раз, сколько нужно.
Отказаться от UBound и LBound в данном случае немного полезно, потому что они для дин.массивов работают долго (лезут в SA, проверяют его, если SA неопределён, выкидывают исключении, если определён, читают поле, в котором хранится число размерностей, лезут в нужную размерность и читают соотв. границу. UBound вообще читает два поля - "нижняя граница" и "кол-во элементов", складывает их и таким образом получает верхнюю).
Кстати, рекомендуется использовать j вместо t.
2)
Изменить принцип перебора.
(Если первый пункт выполнить невозможно)
Перед
- Код: Выделить всё
For t = LBound(SectionArr(i).ValuesS) To UBound(SectionArr(i).ValuesS)
проверять, а не пуст ли массив, и если вдруг пуст -- пропускать цикл.
Проверять можно (придётся) отдельной функцией. Такую функцию можно либо написать самому (например, функция пытается получить LBound, и если возникает ошибка, считается что массив не установлен), либо взять например SafeArrayGetDim.