Vildar прав, надо вводить переменную - счетчик динамического массива, - которая при каждом Redim Preserve ... для этого массива будет менять свое значение. У тебя скорее всего такая переменная используется при заполнении массива. Иначе как ты этот массив заполняешь,- Redim Preserve MyArr(Ubound(MyArr)+1) ? В таком случае перед началом цикла заполнения все-равно надо сначала поставить Redim MyArr(0), иначе та же ошибка вылезет.
Или же через обработчик ошибок, например - такая фунция:
Private Function Check_Array(myarr)
On Error Resume Next
Dim x As Integer
x = UBound(myarr)
If Err <> 0 Then
Err.Clear
x = -1
'MsgBox "Массив пуст"
End If
Check_Array = x
End Function
Передаешь в нее массив и на выходе получаешь кол-во элементов в нем, если оно отрицательное, то элементов в массиве нет.
Не знаю, правда, насколько грамотно массив аргументом передавать... А если массив объявлен глобальным, то и передавать не надо, просто Function Check_Array(), а в коде функции использовать непосредственно его имя..