Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Нужно оптимизировать такой макрос: сопоставляет данные одного листа с данными другого листа и дополняет первый лист колонкой с соответствующими значениями со второго листа. вот код Код: 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. выполняется жутко долго. количество записей и на первом листе и на втором - по 40-60 тыс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 14:40 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
> Автор: VNI > выполняется жутко долго. количество записей и на первом листе и на втором - по 40-60 тыс. А просто прописать формулу проверки в отдельном столбце, и по значению #Н/Д отфильтровать нужные для копирования не пробовал? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 14:45 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, В начале кода поместить такой код: Код: plaintext 1. В конце кода поместить такой код: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 14:46 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Вообще-то такие вещи на таких объемах данных делаются через СУБД. Первое, что приходит в голову, если нет возможности использовать СУБД - отсортировать исходные данные на личтах по возрастанию, и организовать два одновременно перемещающихся курсора по ним. Если вдруг данные под курсорами становятся несинхронными - вычлненить несоответствие, синхронизировать курсоры и продолжать. Тогда это будет в один проход реализовано и уж точно на пару порядков быстрее. Вопрос только, сколько займет сама сортировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 14:46 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос А просто прописать формулу проверки в отдельном столбце, и по значению #Н/Д отфильтровать нужные для копирования не пробовал? не пробовалА. в VBA - самоучка. выкручиваюсь как могу) можно поподробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:16 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Djon Player, спасибо, попробую - может действительно будет быстрее. пока выполняется около 5,5 часов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:17 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, пока только есть такой вариант. над вариантом через СУБД - тоже работаем. с курсорами боюсь не справлюсь сама, но попробую. А вот есть же .find метод и ищет он быстро, пробовали на другой задаче. вот из хелпа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:21 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNIзначение столбца c.Row или c.Range.Row ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:23 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Shocker.ProVNIзначение столбца c.Row или c.Range.Row Виноват - столбец c.Column или c.Range.Column ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:24 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
так это будет на первом листе (или я запуталась?). а мне надо на втором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:24 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, В двух словах уточните на каком листе ведётся поиск, на какой лист помещать значение, откуда это значение взять. Ну и другие нюансы которые может я забыл спросить. А то над самым первым кодом к вечеру уже лень голову ломать и думать, что именно он делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:34 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNIтак это будет на первом листе (или я запуталась?). а мне надо на втором. Вы просто вопрос непонятно задали. с - результат поиска методом Find соответственно с.Row - строка, где найдено значение, c.Column - столбец. С Djon Player я не согласен - отключение обновления экрана скорее всего не поможет, потому что у вас в цикле ничто на экране не обновляется. Метод .Find вместо внутреннего цикла ускорит работу раза в два. Метод двух курсоров на пару порядков (не считая времени на сортировку). К сожалению, сегодня не успею сделать вам пример, могу попробовать завтра, если никто больше не предложит и если это вам действительно нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:36 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
> Автор: VNI > не пробовалА. в VBA - самоучка. выкручиваюсь как могу) можно поподробнее? Дай книгу с небольшим количеством данных, я покажу Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:38 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, В коде присутствует изменения цвета ячеек и установка значений, поэтому какой-то прирост производительности от отключения обновления экрана всё равно будет, вопрос лишь в том, на сколько он большой этот прирост. Я например задачу до конца не понял, а из того что понял, мне почему-то кажется, что я бы решил эту задачу в помощью ВПР. Вобщем надо уточнение задачи, лучше чтобы был файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:40 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
спасибо за такое участие) В двух словах о задаче: есть столбец с уникальными значениями на первом листе - пусть будет Лист1. столбец 1, и такой же столбец на втором (Лист 2.столбец 2). Лист 1 содержит все данные, а лист 2 периодически меняется и нужно значения из листа 2 проставлять в соответствующие строки первого листа. Соответствие по уникальному полю. Нужно в столбец на первом листе Лист 1. Столбец 2 - записать значения из Листа 2.столбец 3. По-моему я еще больше всех запутала сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:47 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
книгу с данными обязательно подготовлю - смогу выложить только завтра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:49 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
а по поводу выделения цветом - пробовала и без него - тоже долго. оно на производительность сильно не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:51 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, действительно нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:53 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, Ну например я вот так состряпал ан скорую руку: Код: 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. В данном примере предполагается, что на первом листе 50 тысяч строк а на втором 10 тысяч строк Можно модифицировать и определите где какое точное количество строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 15:59 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Оптимизировал код: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 16:04 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Можно ещё увеличить скорость за счёт того, что значения в первом столбце первого листа уникальны, поэтому достаточно найти лишь один элемент, а не пытаться найти все элементы, т.к. других там быть не должно. Единственный вопрос ещё остался, что делать с теми элементами, которые есть на втором листе, но нет на первом. Добавить в конец первого листа или такого быть не должно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 16:10 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
нет, если не нашли - то не нашли. ничего добавлять не нужно. Спасибо огромное!!! прогнала на тесте работает. теперь попробую на большом количестве строк. Очень надеюсь, что скорость будет приемлемая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 08:51 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
> Автор: VNI > К сообщению приложен файл (Книга1.xls): cкачать. Размер - 15Kb На пример данных не похоже. потому что только 5 столбцов, а в коде идут операции и с 18 столбцом. Ну да ладно. в твоем файле примем что данные на Лист2 это VNIданные одного листа которые нужно дополнит колонкой с соответствующими значениями со второго листа., а Лист1 это данные которыми нужно дополнять. Сверять данные на листах нужно по данным из столбца "Номер". Закончили с условиями, теперь решение: 1). Копируем столбец "Номер" в столбец "А" на Лист2 2). Переходим на Лист1 и в ячейке F2 пишем формулу: =ВПР(D2;Лист2!$A$2:$E$7;3;ЛОЖЬ) 3). Протягиваем эту формулу по всем строкам. После чего получаем по некоторым ячейкам "имя №", а по некоторым ячейкам #Н/Д. 4). Ставим Автофильтр по всей таблице и по столбцу F выбираем показывать ячейки содержищие #Н/Д 5). Отфильтрованные строки и будут искомыми на добавление. Их нужно скопировать и вставить в Лист2. Всё. Во вложении иллюстрация этого решения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 10:47 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Игорь, спасибо! попробую. По поводу варианта с Find. он ищет так: если строка "1 10.01.2010", то под совпадение попадут строки "1 10.01.2010", "21 10.01.2010", "12341 10.01.2010". о, как. поищу у find настройки какие-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:04 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI если строка "1 10.01.2010", то под совпадение попадут строки "1 10.01.2010", "21 10.01.2010", "12341 10.01.2010". о, как. поищу у find настройки какие-нибудь.Если настройки не найдёшь, то можно после поиска просто сравнивать найденное значение с искомым и если совпадает, то делать нужные действия.Например в моём коде это было бы так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:15 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
выкрутилась вот так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:37 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
о простом сравнении я почему-то не подумала)))))))))))) все, коллапс мозга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:38 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, Немного оптимизировал код с учетом того, что данные на первом столбце первого листа не повторяются. Код: 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. Протестировал на своих данных, где по 35 тысяч строк на каждом листе. Макрс выполнился за 332 секунды. Проделал тоже самое с помощью ВПР, макрос выполнился за 17 секунд. Правда в моем случае для каждой строки первого листа имелась в наличии строка во втором листе. У вас-же я как понял на второй лист добавляются просто некоторые строки, по которым бы вы хотели изменить значения на втором листе. А все остальные должны при этом не изменяться. В этом случае просто так ВПР-ом не обойтись, немного нужно поизвращаться. Приведенный код можно ускорить, если использовать метод двух курсоров как предлагает Shocker.Pro. Но надо при этом правильно отсортировать данные, возможны проблемы если данные в ключевом поле первого листа не совсем "одинакового типа". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:52 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Блин не заметил, что когда тестировал код, у меня позиции столбцов были другие. В вашем случае вместо Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:58 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Djon PlayerПриведенный код можно ускорить, если использовать метод двух курсоров как предлагает Shocker.Pro. Я, наконец, вернулся. Как у вас тут, смогли сделать достаточно быстрый алгоритм, с достаточной скоростью обрабатывающий данные автора? Или попробовать сделать двумя курсорами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 14:59 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Shocker.ProDjon PlayerПриведенный код можно ускорить, если использовать метод двух курсоров как предлагает Shocker.Pro. Я, наконец, вернулся. Как у вас тут, смогли сделать достаточно быстрый алгоритм, с достаточной скоростью обрабатывающий данные автора? Или попробовать сделать двумя курсорами? Я сделал код, в принципе по сравнению с 5 с половиной часами намного быстрее. Но лучше думаю сделать именно методом двух курсоров. Как раз тоже собираюсь это проделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 15:01 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
А вот и мой метод двух курсоров: Код: 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. 37. 38. 39. 40. На этот раз на моих данных код выполнился за 3 секунды. Перед использованием предпологается что данные на первом и втором листе отсортированы по возрастанию по первому столбцу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 15:11 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
может пригодиться... "быстро" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 18:11 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, у метода find есть еще параметры: LookAt:=xlWhole / xlPart, SearchOrder:=xlRows / xlColumns ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 18:30 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 21:22 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
VNI, попробуй применить к своим большим таблицам это. Чтобы уложиться в 100 кб, пришлось отсечь многое. Я работаю с таблицами до 10000 строк. Если будет интересно, спрашивай - отвечу. Щелкая по полям ввода, будешь вводить имена листов и номера столбцов. Твои два листа затащи в эту книгу либо с помощью кнопок, либо руками. Посмотри код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 21:30 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 21:58 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, 1-й вариант не нужно рассматривать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 22:03 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
.Михаил., Изучая ваш код, случайно получил способ, как подвесить Excel. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 23:15 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
У меня тоже есть готовый код для таких случаев, похожий на код от zchvv. Правда у меня объёмы поменьше, так что за скоростью не гнался. Делает то, что надо автору, через Find, может сравнивать и копировать по многим столбцам (не подряд в том числе), есть опции по пробелам и пометки о совпадении... Как вариант: http://hugo.nxt.ru/CompareFiles.Find.rar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 00:48 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Сейчас померил скорость - 3000х3000 несовпадающих записей сверял 40 сек. Проц 2.02ГГц Целерон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 02:03 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Забыл поменять все Integer на Long. Протестировал на 50000 строках. Если убрать прогресс и подсчет перенесенных значений, будет быстрее, но все равно медленно!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 06:17 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Убрал из кода прогресс, подсчет перенесенных значений и цикл по массиву текстбоксов (оставил только А(1) и В(1). На 50000 строках - 13 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 08:18 |
|
||
|
сопоставление данных на двух листах
|
|||
|---|---|---|---|
|
#18+
Окончательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 08:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=60&tid=2159941]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 159ms |

| 0 / 0 |
