|
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
|
|||
---|---|---|---|
#18+
Точнее ситуация такая Имеем лист с ячейками содержащими например такие данные A B C D 1 11121314 1 21222324 Необходимо написать макрос в котором создается массив Arr(2,3) и присваиваем его элементам значение таким образом как реализовано в следующем макросе: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Но хотелось бы избежать цикла при заполнении значениями элементов массива (представленный код его как раз и не имеет) , и как сказанное в комментариях выше, операций "временного" присвоение значений ячейкам листа . В общем, додумался до следующего. Метод Range.PasteSpecial корректно обрабатывает, содержащуюся после копирования в буфере обмена, структуру. Все же попытки работы с объектом tmpRange , созданным и инициализированным в макросе, подобные выполнению следующей операции Arr() = tmpRange.value , приведут к не желаемому результату( Arr(2, 2) содержащему только два столбца "А" и "B") т.к. присваиваются только значения первой Areas и походу иначе невозможно. Но вдруг, все таки возможно, просто я не знаю как, вопрос в том как достичь желаемого. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 14:37 |
|
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
|
|||
---|---|---|---|
#18+
ru_efim, Извиняюсь в коде макроса корректно изменять размерность массива так Код: vbnet 1.
Хотя, похоже, это не принципиально, можно вообще не изменять размерность. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 14:42 |
|
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
|
|||
---|---|---|---|
#18+
Без циклов здесь - никак. Другое дело, что обработка переменных памяти - всегда намного быстрее, чем объектов. Так что можно создавать массив, считывая области объединённого диапазона; или скопировать в массив весь диапазон - а затем удалить ненужные строки/столбцы. А, например, используя API (CopyMemory через RtlMoveMemory, примеров полно) - можно получить такое быстродействие, что мало не покажется Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Смотрим: считываем в массив диапазон A1:D3 (3 строки, 4 столбца), а затем удаляем столбец 2. И получаем масив 3х3. Конечно, можно удалить и несколько столбцов сразу. А изменение размерности - вынести из процедуры (или встроить CopyMemory на предыдущий уровень). Или удалить строки (транспонируя исходный массив, например). etc... P.S. 16 - это размер в байтах ячейки массива типа Variant. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 18:50 |
|
|
start [/forum/topic.php?desktop=1&fid=61&tid=2174317]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
80ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 330ms |
total: | 502ms |
0 / 0 |