Проблема с Redim Preserve (2D-массив)

Еще одна тема с многомерным массивом и Redim Preserve, я знаю. Я прочитал их много, но до сих пор не могу понять, почему мой код не работает.

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

Чтобы изолировать проблему, я тестирую 2 кода:

Sub test_Redim_Preserve()

Dim arr() As Variant

ReDim arr(10, 10)
ReDim Preserve arr(UBound(arr,1), UBound(arr,2) + 1)

End Sub

Это работает нормально

Sub test_Redim_Preserve2()

Dim arr() As Variant

ReDim arr(10, 10)
arr = Range("A1:J10")
ReDim Preserve arr(UBound(arr,1), UBound(arr,2) + 1)

End Sub

Это дает мне ошибку. Я просто дал диапазон для заполнения моего массива, а затем не могу его изменить. Я не понимаю, чего ему не хватает, чтобы принять Redim.

Может ли кто-нибудь объяснить мне?


person MüdeFuchs    schedule 07.09.2017    source источник


Ответы (2)


Нижняя граница по умолчанию, при отсутствии противоположного оператора Option Base, равна 0, но вы назначаете диапазон массиву, он всегда имеет нижнюю границу 1, поэтому ваш код фактически пытается изменить размер первого измерения массива. массив тоже, изменив его нижнюю границу. Использовать:

ReDim Preserve arr(1 To UBound(arr, 1), 1 To UBound(arr, 2) + 1)
person Rory    schedule 07.09.2017
comment
Хорошо, сейчас я понимаю. Я думал, что первое значение из моего диапазона будет равно arr(0,0), но вместо этого оно будет равно arr(1,1). Спасибо за ваше объяснение и решение. - person MüdeFuchs; 07.09.2017

Вы можете использовать Option Base 1 в верхней части кода, и тогда исходный код будет работать нормально.

Полный код:

Option Base 1

Sub test_Redim_Preserve2()

Dim arr() As Variant

ReDim arr(10, 10)
arr = Range("A1:J10")
ReDim Preserve arr(UBound(arr, 1), UBound(arr, 2) + 1)

End Sub
person Shai Rado    schedule 07.09.2017
comment
Спасибо за ваше решение тоже. - person MüdeFuchs; 07.09.2017