|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Здравствуйте. помогите решить следующий вопрос, плиз. Добавил данные с листа1 в массив Dim a() Dim r As Range Sheets("Лист1").Select Set r = [A1:D2000] cc = r.Columns.Count rc = r.Rows.Count ReDim a(1 To rc, 1 To cc) a = r.Value затем произвел сданными к-л действия Вопрос Необходимо вставить изменённые данные обратно в Excel на лист2. Какой самый простой и быстрый способ вставить данные из массива на лист Excel? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 11:33 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
alex96822, есть такой способ, причем и для взять тоже.. dim arr arr=[A1:D2000] ... Sheets("Лист2").Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 11:49 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
alex96822...Какой самый простой и быстрый способ вставить данные из массива на лист Excel? Скажите пожалуйста, а ипользовать массив в Вашем примере - это религиозные убеждения или техническое задание? У объекта Range достаточно своих свойств и методов для озвученной функциональности. Пример (упрощенный). Берем Ваш исходный Range, вызываем на нем метод Copy с указанием целевой ячейки. Создаем новый Range на основе скопированного диапазона. Дальше Columns.Count и Rows.Count дают Вам границы. Бегаем внутри Вашего нового Range с помощью свойства Cells и "фантазируем". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 12:42 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Спасибо, _slan_ . arr это как раз то что нужно. Папа Игорь, нет не техническое задание, просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 12:54 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
alex96822...просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь Тестируйте. Но имейте ввиду, что Range - "родной" объект для объектной модели Excel, а массив - это структура данных для VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2009, 13:02 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорьalex96822...просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь Тестируйте. Но имейте ввиду, что Range - "родной" объект для объектной модели Excel, а массив - это структура данных для VBA. вот именно, а работает-то человек именно с VBA.. бывают разные случаи, но загрузка данных в массив и обработка этого массива - практически стандартный метод экономии времени, иногда на порядок.. попробуйте сами.. но в общем, к каждому конкретному случаю надо подходить отдельно - чаще всего наиболее эффективным является комбинация возможностей иксель и vba ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 17:32 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_...бывают разные случаи, но загрузка данных в массив и обработка этого массива - практически стандартный метод экономии времени, иногда на порядок.. Не надо быть столь категоричным. _slan_...попробуйте сами.. Ну это... Регулярно пробуем. _slan_...но в общем, к каждому конкретному случаю надо подходить отдельно ... Мое предложение тестировать как бы этому не противоречит. Не находите? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 18:28 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорь, ваше утверждение, что обращение к Cells может быть быстрее обращения к массиву мягко говоря не совсем верно.. массив намного быстрее, это однозначно. просто есть и другие способы обработки диапазонов - встроенные в иксель методы и свойства, они предпочтительнее, если надо отражать данные обратно на листе, чтобы не тратить время на чтение в массив и обратно. да и то не всегда.. в общем, что спорить, предложите задачу, сделайте ее как вы считаете нужным, потом я сделаю по-своему - посмотрим? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 20:28 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_Папа Игорь, ваше утверждение, что обращение к Cells может быть быстрее обращения к массиву мягко говоря не совсем верно.. массив намного быстрее, это однозначно. Возможно Вам поможет следующее: 1. Обращаясь к каждой ячейке через Cells автор вгоняет исходные данные в массив. 2. Идет обработка массива. 3. Обращаясь к каждой ячейке через Cells в новом диапазоне перегоняет обработанные данные. Пункты 1 и 2 - это сценарий автора топика. Пунк три это то, чем ему хочется все завершить. Надеюсь, очень надеюсь, что Вы внимательно это прочтете и поймете, что массив здесь - лишний . Извините за "много жирным". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 20:43 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_...Папа Игорь... Как-то Вы "выборочно" меня читаете/цитируете. Приписывая мне то, что Вы увидели (просмотрели) в моих высказываниях. Обращайте, пожалуйста, внимание на контекст . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 20:47 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Маленькое замечание. Вы заблуждаетесь, что обозвав переменную arr, Вы получаете массив. Ваш пример, _slan_ dim arr arr=[A1:D2000] ... Sheets("Лист2").Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr противоречит документации от MS. You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property. You do not have to type the word "Range" or use quotation marks, as shown in the following examples. Код: plaintext 1. 2. 3. 4. 5. 6.
Массивы в VBA объявляются с "кругленькими" скобочками. Код: plaintext
То, что VBA может неявно преобразовывать типы данных - это хорошо, но лучше делать это самому. Так надежнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 21:31 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорь, спасибо, что просветили насчет круглых скобочек :) (это сарказм без малейшей обиды) тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив , что , конечно, несколько проигрывает при обработке, но выигрывает при обмене с листом иксель - это как раз вариант комбинированного подхода. Если бы я генерировал массив в vba, то ,несомненно , определил бы его как положено. далее :) противоречит документации от MS. You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property. You do not have to type the word "Range" or use quotation marks, as shown in the following examples . где же противоречие? ведь это переводится как: вы можете использовать как a1-стиль так и именованные диапазоны в квадратных скобках.. вы не обязаны писать слово range или использовать апострофы ..(я немножко знаю английский :) ) далее - если противоречит документации, но работает, то тем хуже для документации, нет? и все таки - давайте проверим наши подходы на задачке? если вы не хотите выбирать "оружие", то я сам через некоторое время предложу вариант.. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 09:24 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
да, про самое последнее - в принципе верно, я и спользую опцию explicit и определяю типы данных заранее, но бывают варианты (:) простите за каламбур), когда надо использовать именно тип вариант, который является типом по умолчанию, и его необъявление явно - это просто знание умолчаний и, конечно, лень.. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 09:30 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
вот "распечатка" окна вычислений примера 1 - результаты варианта с массивом 2 - вариант с range.cells код во вложении - суть примера: 20000 строк заполнены тестовыми строками, состоящими из 7 латинских "a". в одной из них вместо латинской стоит русская "а". задача - найти эту ячейку. Код: plaintext 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. 31. 32. 33. 34. 35. 36.
как и говорилось, разница на порядок конечно, можно решить это и другим способом.., но хотелось проиллюстрировать именно перебор с помощью range.cells ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 10:22 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
да и возьмем мой начальный пример: Код: plaintext 1. 2. 3.
как бы вы определили arr иначе? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 10:32 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
кстати, такой "икселевский" способ, как формула, уступает вба: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
время - 0,0625 время - 0,0625 время - 0,0625 время - 0,0625 время - 0,046875 время - 0,046875 время - 0,046875 время - 0,0625 время - 0,0625 время - 0,078125 время - 0,046875 время - 0,046875 время - 0,0625 время - 0,046875 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 10:47 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
кстати :) такой способ перебора вдвое быстрее Sub test4() Dim arr As Range, t!, i&, x As Range t = Timer Set arr = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)) For Each x In arr.Cells If x > "aaaaaaa" Then i = x.Row Cells(1, 2) = i Exit For End If Next Debug.Print i, " время - " & Timer - t End Sub но все равно значительно уступает массиву (это иллюстрация тому, что сама запись cells(a,b) - это не просто ссылка, а вычисление) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 11:28 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_Папа Игорь, спасибо, что просветили насчет круглых скобочек :) (это сарказм без малейшей обиды) Да пожалуйста. И без всякого сарказма. _slan_тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив Какая наивность. Вашу ошибку Вы поймете из дальнейшего. _slan_You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property. ведь это переводится как: вы можете использовать как a1-стиль так и именованные диапазоны в квадратных скобках.. Вы остановились в своем переводе именно на значимом месте. Хотя чему удивляться - ведь это противоречит Вашей позиции. Это переводится так: Для обращения к свойству Range вы можете использовать любой из двух подходов - стиль А1 или или краткую нотацию внутри квадратных скобок. Далее по тексту. Как видим, к массивам это не имеет никакого отношения. А вот используя затем функцию UBound() Вы заставляете VBA неявно преобразовать Range в массив и вернуть Вам значения границ. А это лишнее. Учите матчасть (без обид). _slan_...(я немножко знаю английский :) ) Как видите "немножко" иногда приводит к "множким" заблуждениям. _slan_...и все таки - давайте проверим наши подходы на задачке? Мерятся чем-либо у меня нет никакого желания. У нас различаются не подходы, а уровни знаний предмета. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 11:30 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_...и все таки - давайте проверим наши подходы на задачке?... Чтобы окончательно показать Вам Ваши танцы с неявными преобразованиями, я изменил Ваш пример для большей ясности. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Теперь, надеюсь, Вам понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 12:20 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
_slan_...и все таки - давайте проверим наши подходы на задачке?... И о тестировании. Не для самоутверждения, а для страхования новичков от использования непродумманных советов. Вот тест измеряющий Ваш и мой "подходы". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Результат в окне отладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 13:21 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорь _slan_тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив Какая наивность. Вашу ошибку Вы поймете из дальнейшего. Почти по Шекспиру ;) Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 14:43 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
ZVI...Почти по Шекспиру ;) Код: plaintext 1. 2. 3. 4. 5.
Да нет там Шекспира, чистый " лояльный VBA". Вначале, по обращению [A1:D2000], VBA неявно создает Range потом перегоняет его в Variant массив arr. В итоге, да, человек имеет массив, который потом, опять неявно , VBA перегоняет в Range при вызове Sheets("Лист2").Range("A1").Resize(UBound(arr), UBound(arr, 2)) = arr Здесь "лишние" телодвижения с массивом. На что и указывалось. P.S. Заниматься неявным преобразованием = возможность наступить на грабли. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 15:12 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
ZVI...Почти по Шекспиру ;) Код: plaintext 1. 2. 3. 4. 5.
И чтобы окончательно разобраться с литературой. Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 15:57 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорь_slan_...и все таки - давайте проверим наши подходы на задачке?... Чтобы окончательно показать Вам Ваши танцы с неявными преобразованиями, я изменил Ваш пример для большей ясности. Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Теперь, надеюсь, Вам понятно. нифига себе изменил! а нафига? вы между двумя этими строчками разницу понимаете? arr=[a1:a10] и set arr=[a1:a10] ? на грабли наступает тот, кто не знает, что такое грабли.. я сознательно пользуюсь неявными преобразованиями- и мой код быстрее. решите ту же задачу, что я предложил. Сравнивать-то можно только на одинаковых задачах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 17:38 |
|
Вставить данные из массива на лист Excel
|
|||
---|---|---|---|
#18+
Папа Игорь_slan_...и все таки - давайте проверим наши подходы на задачке?... И о тестировании. Не для самоутверждения, а для страхования новичков от использования непродумманных советов. Вот тест измеряющий Ваш и мой "подходы". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Результат в окне отладки. куда же Вы дели те самые ... из первоначального топика. Ведь в них-то и суть. Без этого не стоило и затевать ничего. а значения с одного места на другое я могу перенести в два раза быстрее: Sheets("Лист2").Range("A1").Resize(myarr.rows.count,myarr.columns.count).value=myarr.value а зачем вам нужно было копировать и форматы Вы нам объясните.. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2009, 17:56 |
|
|
start [/forum/topic.php?fid=61&msg=35887229&tid=2173548]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 307ms |
total: | 447ms |
0 / 0 |