Здравствуйте!
Сразу прошу прощения за "стену текста", познаю VBA недавно. Хочется не только получить результат, но и понять логику разработки.
Есть "х" листов с разным количеством заполненных строк и одинаковым количеством заполненных столбцов. Т.е. первая размерность разная, вторая одинаковая.
Необходимо собрать данные со всех листов в один массивДолжно получиться так (на примере двух листов):
+ : arr1 : : Variant/Variant(1 to 26, 1 to 200) - массив с первого листа
+ : arr2 : : Variant/Variant(1 to 29, 1 to 200) - массив со второго листа
+ : arr3 : : Variant/Variant(1 to 55, 1 to 200) - "массив массивов"
Для решения задачи (и подтверждения того, что "массив массивов" подойдет) был использован код с перебором значений (под спойлером).
Работает, но проблема заключается в том, что нужно использовать не 2 листа, а, к примеру, 20 или 50 (количество постоянно меняется).
Скрытый текст |
---|
Код |
---|
Dim arr1 As Variant, arr2 As Variant, arr3 As Variant
Dim i As Long, j As Long
lrow1 = Sheets("1").Cells(Rows.Count, 1).End(xlUp).Row
lrow2 = Sheets("2").Cells(Rows.Count, 1).End(xlUp).Row
arr1 = Sheets("1").Range("A1:GR" & lrow1)
arr2 = Sheets("2").Range("A1:GR" & lrow2)
ReDim arr3(1 To (UBound(arr1) + UBound(arr2)), _
1 To Application.Max(UBound(arr1, 2), UBound(arr2, 2)))
For i = 1 To UBound(arr1)
For j = 1 To UBound(arr1, 2)
arr3(i, j) = arr1(i, j)
Next j, i
For i = 1 To UBound(arr2)
For j = 1 To UBound(arr2, 2)
arr3(i + UBound(arr1), j) = arr2(i, j)
Next j, i
|
|
На данном форуме удалось найти единственный, похожий на мою ситуацию, совет-ответ, к большому сожалению, без самого кода:
Цитата |
---|
The_Prist написал: Вообще, для сокращения кол-ва строк кода можно собирать в отдельные массивы данные с книг. Сами массивы помещать в один общий массив(в котором будут эти массивы). Иными словами создать массив массивов. А потом все это выгружать или объединить в один массив. Как алгоритм: 1. Создаем динамический массив массивов(avMain) 2. Идем циклом по книгам и собираем данные в промежуточные массивы(avBook_1, avBook_2 ... avBook_n). Попутно в отдельную переменную плюсуем размерность каждого массива: lResCnt = lResCnt + Ubound(avBook1,1) 3. Определяем размерность результирующего массива(avRes): ReDim avRes(1 to lResCnt, 1 to lColsCnt) 4. Осталось только пройтись циклом по avMain и по очереди выгрузить циклами данные из этих массивов в avRes. |
Решение вроде понятное, но как его преобразовать в макрос не могу сообразить.
1) создать динамический массив массивов - разве его можно создать первым пунктом, без понимания размерности?
2) идем циклом по листам и собираем данные в промежуточные массивы - я понимаю, как задать цикл по листам, но как автоматически задать каждому листу новый-уникальный массив?
3) ...
К сообщению прикрепил файл с примером. Голые данные, без макросов.
Если необходимо