Страницы: 1
RSS
Изменение размерности двумерного массива
 
Всем привет!
Подскажите пожалуйства, как расширять динамический массив по мере появления новых данных, при их сборе циклом?
Второй день ковыряюсь, ошибку все найти не могу)))  Статей много прочёл, но с места сдвинуться не могу))
Код
Sub test()
LastRow = 2
Dim arr() As Variant
ReDim arr(1 To 1, 1 To 4)
Dim i%, k%

For i = 1 To LastRow
        k = k + 1
        ReDim Preserve arr(1 To UBound(arr, 1) + 1, 1 To 4) 'вылетает ошибка subscrpt out of range
        arr(k, 1) = "Привет"
        arr(k, 2) = "Пусто"
        arr(k, 3) = "Пусто"
        arr(k, 4) = "и снова здравствуйте"
Next i

Range("A1:D2") = arr
End Sub
Изменено: Юрий М - 29.04.2022 11:48:35
 
Код
Sub test()

Dim arr(), i&
Const LastRow& = 2

ReDim arr(1 To LastRow, 1 To 4)

For i = 1 To LastRow
        arr(k, 1) = "Привет"
        arr(k, 2) = "Пусто"
        arr(k, 3) = "Пусто"
        arr(k, 4) = "и снова здравствуйте"
Next i
 
Range("A1").Resize(UBound(arr,1), UBound(arr,2) ).Value = arr
End Sub
А по вашему вопросу: ReDim Preserve может менять только ПОСЛЕДНЮЮ размерность массива (столбцы - в данном случае). Вот тут подробнее про массивы.
Изменено: Jack Famous - 29.04.2022 10:40:07
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Preserve работает только с последней размерностью. Т.е. только так:
Код
ReDim Preserve arr(1 To 4, 1 To UBound(arr, 1) + 1)
а потом транспонировать
Код
Range("A1:D2") = Application.Transpose(arr)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Большое спасибо)))
Проще перебрать на условие отдельно, потом задать массив и заполнить его тогда
 
Код
Sub test()
Const LastRow = 2
Dim brr As Variant
ReDim brr(1 To 4)
Dim arr() As Variant
ReDim arr(1 To 1)
Dim i%, k%
For i = 1 To LastRow
    brr(1) = "Привет"
    brr(2) = i
    brr(3) = "Пусто"
    brr(4) = "и снова здравствуйте"
    arr(UBound(arr)) = brr
    ReDim Preserve arr(1 To UBound(arr) + 1)
Next i
Dim crr As Variant
ReDim crr(1 To UBound(arr) - 1, 1 To UBound(brr))
For i = 1 To UBound(crr, 1)
    For k = 1 To UBound(crr, 2)
        crr(i, k) = arr(i)(k)
    Next
Next
Range("A1:D2") = crr
End Sub
 
Цитата
Kazanildarik написал:
Проще перебрать на условие отдельно, потом задать массив
если знаете как проще, к чему вопросы? делайте как проще и задача решена
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Не понимал что можно менять только последнюю размерность.
Обойти это ограничесние можно вариантами что предложили
 
Кто предложит адекватное название темы?
 
Не претендуя на адекватность )
Изменение размерности двумерного массива
 
Цитата
Kazanildarik: Проще перебрать на условие отдельно, потом задать массив и заполнить его тогда
быстрее задать массив с запасом в разумных пределах, если это можно, а как делать в вашем случае, я показал — никакого изменения размерности не нужно
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх