UBound внутри Redim Preserve выбрасывает «Индекс вне диапазона» - PullRequest
1 голос
/ 08 ноября 2019

Я хочу использовать динамический массив, содержащий произвольное количество строк. Массив заполняется логикой if ... then вместо цикла. Я получаю Subscript out of range ошибку:

Dim Files() As String

If True Then
    ReDim Preserve Files(UBound(Files) + 1) ' Throws "Subscript out of range" error
    Files(UBound(Files)) = "foo.pdf"
End If

If True Then
    ReDim Preserve Files(UBound(Files) + 1)
    Files(UBound(Files)) = "bar.txt"
End If

If True Then
    ReDim Preserve Files(UBound(Files) + 1)
    Files(UBound(Files)) = "baz.jpg"
End If

У меня есть функция, объявленная так:

Function SendFiles(Files() As String)

Я хочу избавиться от этой ошибки без использования вариантов, если это возможно. Я могу переписать код, но не могу использовать цикл.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Ваш массив не инициализируется в начале, и вы не можете Redim Preserve неинициализированный массив.

Если вы хотите, чтобы строковый массив содержал переменное количество элементов, возможно, ноль, вы можете начатьс инициализацией его в массив нулевой длины, используя Split:

Files = Split(vbNullString)
1 голос
/ 08 ноября 2019

Вы также можете выделить достаточно большой массив и впоследствии изменить его размер до используемого. Таким образом, у вас есть только 1 изменение размера. Как то так:

Dim Files(1000) As String, i as long

If True Then
    Files(i) = "foo.pdf": i = i+1
End If

If True Then
    Files(i) = "bar.txt": i = i+1
End If

If True Then
    Files(i) = "baz.jpg": i = i+1
End If

redim preserve Files(i-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...