Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Наполнение массива диапазонами в цикле - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Наполнение массива диапазонами в цикле (Макросы/Sub)
Наполнение массива диапазонами в цикле
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]
К сообщению приложен файл: 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]
К сообщению приложен файл: 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
Репутация: 989 ±
Замечаний: 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 элементов


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
Дата добавления - 29.10.2019 в 14:38
krosav4ig Дата: Вторник, 29.10.2019, 15:59 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 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]


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
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Наполнение массива диапазонами в цикле (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!