Наполнение массива диапазонами в цикле
Almost
Дата: Вторник, 29.10.2019, 10:58 |
Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация:
2
±
Замечаний:
0% ±
Excel 2016
Добрый день! Сделал упрощённый пример диапазона 3х5, который надо залить в массив. Одной командой его залить нельзя, так как в оригинале это 5 диапазонов 3х1 в разных файлах. Поэтому считываются через цикл перебором. Поскольку боевой массив значительно больше, и из спортивного интереса, задался вопросом, можно ли в цикле считать в массив сразу диапазон 3х1, а не каждое значение поштучно через вложенный цикл? Такой код не работает, в массив ничего не записывается: [vba]Код
Sub Stat() Dim aBase() Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3, 1 To iCr) For iCr = 1 To 5 aBase(1, iCr) = ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = aBase End Sub
[/vba]
Добрый день! Сделал упрощённый пример диапазона 3х5, который надо залить в массив. Одной командой его залить нельзя, так как в оригинале это 5 диапазонов 3х1 в разных файлах. Поэтому считываются через цикл перебором. Поскольку боевой массив значительно больше, и из спортивного интереса, задался вопросом, можно ли в цикле считать в массив сразу диапазон 3х1, а не каждое значение поштучно через вложенный цикл? Такой код не работает, в массив ничего не записывается: [vba]Код
Sub Stat() Dim aBase() Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3, 1 To iCr) For iCr = 1 To 5 aBase(1, iCr) = ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = aBase End Sub
[/vba] Almost
К сообщению приложен файл:
test.xlsb
(15.8 Kb)
Сообщение отредактировал Almost - Вторник, 29.10.2019, 11:33
Ответить
Сообщение Добрый день! Сделал упрощённый пример диапазона 3х5, который надо залить в массив. Одной командой его залить нельзя, так как в оригинале это 5 диапазонов 3х1 в разных файлах. Поэтому считываются через цикл перебором. Поскольку боевой массив значительно больше, и из спортивного интереса, задался вопросом, можно ли в цикле считать в массив сразу диапазон 3х1, а не каждое значение поштучно через вложенный цикл? Такой код не работает, в массив ничего не записывается: [vba]Код
Sub Stat() Dim aBase() Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3, 1 To iCr) For iCr = 1 To 5 aBase(1, iCr) = ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = aBase End Sub
[/vba] Автор - Almost Дата добавления - 29.10.2019 в 10:58
Almost
Дата: Вторник, 29.10.2019, 12:22 |
Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация:
2
±
Замечаний:
0% ±
Excel 2016
В общем, нашёл способ. Поскольку итог надо было ещё и транспонировать, добавил второй массив. В него считывается диапазон и между массивами транспонируется. Работает быстро. Тему можно закрывать. [vba]Код
Sub Stat() Dim aBase(), aTemp() Dim iCr As Integer, iCol As Integer iCol = 8 ReDim aBase(1 To iCol, 1 To 5) For iCr = 1 To iCol aTemp = ActiveSheet.Cells(1, iCr + 1).Resize(5, 1).Value For iCol = 1 To 5 aBase(iCr, iCol) = aTemp(iCol, 1) Next iCol Next iCr ActiveSheet.Cells(7, 11).Resize(iCr - 1, 5).Value = aBase End Sub
[/vba]
В общем, нашёл способ. Поскольку итог надо было ещё и транспонировать, добавил второй массив. В него считывается диапазон и между массивами транспонируется. Работает быстро. Тему можно закрывать. [vba]Код
Sub Stat() Dim aBase(), aTemp() Dim iCr As Integer, iCol As Integer iCol = 8 ReDim aBase(1 To iCol, 1 To 5) For iCr = 1 To iCol aTemp = ActiveSheet.Cells(1, iCr + 1).Resize(5, 1).Value For iCol = 1 To 5 aBase(iCr, iCol) = aTemp(iCol, 1) Next iCol Next iCr ActiveSheet.Cells(7, 11).Resize(iCr - 1, 5).Value = aBase End Sub
[/vba] Almost
К сообщению приложен файл:
test.xlsm
(18.5 Kb)
Ответить
Сообщение В общем, нашёл способ. Поскольку итог надо было ещё и транспонировать, добавил второй массив. В него считывается диапазон и между массивами транспонируется. Работает быстро. Тему можно закрывать. [vba]Код
Sub Stat() Dim aBase(), aTemp() Dim iCr As Integer, iCol As Integer iCol = 8 ReDim aBase(1 To iCol, 1 To 5) For iCr = 1 To iCol aTemp = ActiveSheet.Cells(1, iCr + 1).Resize(5, 1).Value For iCol = 1 To 5 aBase(iCr, iCol) = aTemp(iCol, 1) Next iCol Next iCr ActiveSheet.Cells(7, 11).Resize(iCr - 1, 5).Value = aBase End Sub
[/vba] Автор - Almost Дата добавления - 29.10.2019 в 12:22
krosav4ig
Дата: Вторник, 29.10.2019, 12:43 |
Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация:
997
±
Замечаний:
0% ±
Excel 2007,2010,2013
Добры день [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 5) For iCr = 1 To 5 aBase(iCr) = Application.Transpose(ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value) Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase) End Sub
[/vba] ограничение размерностей массива - 4^8 элементов
Добры день [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 5) For iCr = 1 To 5 aBase(iCr) = Application.Transpose(ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value) Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase) End Sub
[/vba] ограничение размерностей массива - 4^8 элементов krosav4ig
email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
Ответить
Сообщение Добры день [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 5) For iCr = 1 To 5 aBase(iCr) = Application.Transpose(ActiveSheet.Cells(1, iCr + 1).Resize(3, 1).Value) Next iCr ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase) End Sub
[/vba] ограничение размерностей массива - 4^8 элементов Автор - krosav4ig Дата добавления - 29.10.2019 в 12:43
Almost
Дата: Вторник, 29.10.2019, 14:38 |
Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация:
2
±
Замечаний:
0% ±
Excel 2016
krosav4ig , спасибо, а какой тип данных в массиве получается таким способом? А то второе транспонирование лишнее, но если я меняю [vba]Код
ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase)
[/vba] на [vba]Код
ActiveSheet.Cells(5, 10).Resize(iCr - 1, 3).Value = aBase
[/vba] то ячейки заполняются пустотой.
krosav4ig , спасибо, а какой тип данных в массиве получается таким способом? А то второе транспонирование лишнее, но если я меняю [vba]Код
ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase)
[/vba] на [vba]Код
ActiveSheet.Cells(5, 10).Resize(iCr - 1, 3).Value = aBase
[/vba] то ячейки заполняются пустотой.Almost
Ответить
Сообщение krosav4ig , спасибо, а какой тип данных в массиве получается таким способом? А то второе транспонирование лишнее, но если я меняю [vba]Код
ActiveSheet.Cells(5, 10).Resize(3, iCr - 1).Value = Application.Transpose(aBase)
[/vba] на [vba]Код
ActiveSheet.Cells(5, 10).Resize(iCr - 1, 3).Value = aBase
[/vba] то ячейки заполняются пустотой.Автор - Almost Дата добавления - 29.10.2019 в 14:38
krosav4ig
Дата: Вторник, 29.10.2019, 15:59 |
Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация:
997
±
Замечаний:
0% ±
Excel 2007,2010,2013
Variant массив aBase в цикле наполняется одномерными массивами, транспонирование в цикле нужно для того, чтобы, собственно, делать эти массивы одномерными В итоге получаем одномерный массив массивов. Для того, чтобы сделать из него двумерный массив, нужно его транспонировать. другой вариант использования этого приема [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3) For iCr = 1 To 3 aBase(iCr) = ActiveSheet.Cells(iCr, 2).Resize(1, 5).Value Next iCr ActiveSheet.Cells(5, 10).Resize(iCr - 1, 5).Value = Application.Index(aBase, 0, 0) End Sub
[/vba]
Variant массив aBase в цикле наполняется одномерными массивами, транспонирование в цикле нужно для того, чтобы, собственно, делать эти массивы одномерными В итоге получаем одномерный массив массивов. Для того, чтобы сделать из него двумерный массив, нужно его транспонировать. другой вариант использования этого приема [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3) For iCr = 1 To 3 aBase(iCr) = ActiveSheet.Cells(iCr, 2).Resize(1, 5).Value Next iCr ActiveSheet.Cells(5, 10).Resize(iCr - 1, 5).Value = Application.Index(aBase, 0, 0) End Sub
[/vba] krosav4ig
email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
Ответить
Сообщение Variant массив aBase в цикле наполняется одномерными массивами, транспонирование в цикле нужно для того, чтобы, собственно, делать эти массивы одномерными В итоге получаем одномерный массив массивов. Для того, чтобы сделать из него двумерный массив, нужно его транспонировать. другой вариант использования этого приема [vba]Код
Sub Stat() Dim aBase Dim iCr As Integer iCr = 5 ReDim aBase(1 To 3) For iCr = 1 To 3 aBase(iCr) = ActiveSheet.Cells(iCr, 2).Resize(1, 5).Value Next iCr ActiveSheet.Cells(5, 10).Resize(iCr - 1, 5).Value = Application.Index(aBase, 0, 0) End Sub
[/vba] Автор - krosav4ig Дата добавления - 29.10.2019 в 15:59