Страницы: 1
RSS
Из массива в диапазон.
 
Подскажите, как из массива вставить в диапазон все значения разом, без циклического заполнения ячеек?
Код
Private Sub CommandButton1_Click()
Dim a(1 To 20) As Integer, i&

Range("A:A").ClearContents

For i = 1 To 20
        a(i) = Int(Rnd() * 21)
        Cells(i, 1).Value = a(i)
Next i


End Sub
 
Вариант:
Код
Private Sub CommandButton1_Click()
Dim a(1 To 20, 1 To 1), i&
    Range("A:A").ClearContents
    For i = 1 To 20
        a(i, 1) = Int(Rnd() * 21)
    Next
    Range("A1").Resize(20, 1).Value = a
End Sub
 
сделайте так:(строка 3 в коде - это то, о чем Вы спрашивали)
Код
  Range("A:A").ClearContents
  a(1) = 111: a(20) = 222
  [a1].Resize(UBound(a), 1) = WorksheetFunction.Transpose(a)
Изменено: Ігор Гончаренко - 22.09.2019 14:33:21
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
сделайте так:(строка 3 в коде - это то, о чем Вы спрашивали)
Я не понял, о какой третьей строке идет речь. Ваш код у меня не работает, т.к. я его не совсем понимаю, поэтому, возможно не туда вставляю. Поясните.



Вот такой результат.  
Изменено: НСС - 22.09.2019 14:44:22
 
Мой вариант тоже не работает? )
 
Цитата
Юрий М написал:
Мой вариант тоже не работает? )
Ваш вариант прекрасно работает и понятен. Но теперь и во втором хочется разобраться. А если еще варианты появятся, то это вообще круто будет.  
 
Код
Private Sub CommandButton1_Click()
  Dim a(1 To 20) As Integer, i&
  Range("A:A").ClearContents
  For i = 1 To 20
    a(i) = Int(Rnd() * 21)
  Next i
  [a1:a20] = WorksheetFunction.Transpose(a) 'вывод массива А в Диапазон А1:А20 без цикла
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо. Все прекрасно работает. Извиняюсь, что не сразу понял.  
 
Цитата
Ігор Гончаренко написал:
WorksheetFunction.Transpose
- у этого метода есть куча недостатков.
Поэтому рекомендую в первом коде заполнять сразу двумерный массив, чтоб потом его выгрузить на лист без всяких транспонирований как в примере Юрия.
 
Hugo, полностью согласен. Зачем вообще транспонировать, если в том же цикле можно формировать СРАЗУ ДВУМЕРНЫЙ массив a(n строк, 1 столбец)…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Можно и так:
(формулу и диапазон свою подставьте)
Код
Sub Макрос1()
    [b2..d10].FormulaR1C1 = "=INT(RAND()*1000)"
    [b2..d10].Value = [b2..d10].Value
End Sub
Изменено: Александр Моторин - 22.09.2019 23:02:43
 
Для интереса проверил скорость выполнения макросов: циклом, выгрузкой из двумерного массива и транспонированием, все работают в диапазоне [b1:b1000] и вот что получилось:
1. Двумерный массив отстает.



2. Скорость выполнения одинаковая.



3. Двумерный опять отстает.



4. Двумерный опережает транспонирование.



5. Двумерный опять опережает транспонирование.



6. Сравнялись.



Почему такие разбросы по скорости? Цикл стабильно медленно работает, а при транспонировании и выгрузки из двумерного массива скорости всегда разные и опережают друг друга.

p.s. замерялась скорость выполнения по отношению к циклическому заполнению диапазона.  
Изменено: НСС - 23.09.2019 08:14:37
 
НСС, ну раз вы тестить взялись то давайте рассказывайте:
    • как вы обеспечивали "равные условия"? При разнице в сотые доли секунды, такие тесты, как пук в воздух (из-за обычных колебаний производительности). Возьмите массив 10000 строк и 10 столбцов хотя бы. Или просто 100 000 строк и 1 столбец
    • сравните с самописными функциями транспонирования, которые не имеют серьёзных ограничений штатной (спойлер - у меня на массиве 2 000 000 строк х 3 столбца отработала за 1,5 сек БЕЗ ВЫГРУЗКИ)
    • при разнице в сотни раз (с заполнением циклом) какой смысл сравнивать? Оставьте 2х кандидатов для более точного сравнения
    • ну и конечно приложите тестовый стенд с кодами под спойлером, чтобы остальные могли перепроверить ваши данные
Изменено: Jack Famous - 23.09.2019 10:20:50
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх