|
|
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Собственно проблема такая: Все замечательно работает, но долго.. лист с 200 строками обрабатывает 30 сек, помогите ускорить макрос если это возможно. Макрос вставляет в три таблички значения из другого файла..по критериям. Вот код: Код: 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. Очень прошу помощи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2011, 16:08 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Для начала научиться оформлять код на форуме (см. правила и FAQ по оформлению сообщений) Потом избавиться от всех Select, Selection и Active ибо констукция Код: plaintext 1. Код: plaintext После этого можно посмотреть, что там в коде такого тормозного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2011, 16:46 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Вот: удалил Select Selections. Еще пробовал отключать расчет по формулам...и вставлялось всё моментально, но по понятным причинам везде одно и то же значение..А так время выполнения макроса все то же 30 сек....прошу помощи в оптимизации кода.. Код: 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2011, 18:04 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Geo28от: удалил Select Selectionsкак же удалил, когда еще 17 раз встречается... Нет никакого смысла делать Select, а потом работать с Selection или с ActiveCell, можно все методы применять сразу к Range. То же касается закрытия активного окна.... Ну а по производительности... хорошо бы файл иметь, чтобы на нем смотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2011, 18:35 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
ИМХО, ускорить "вставление" здесь сможет отключение/включение автопересчета (ибо ВПР() летуча...) Ну и, естественно, изучение объекной модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2011, 05:52 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
AndreTM...ибо ВПР() летуча... ВПР не летуча. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2011, 05:58 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Т.е. сперва тянете данные кучей ВПР(), потом меняете их на значения? Можно сразу всё взять кодом, но нужен пример в файле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2011, 13:10 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Serge 007, а, да, тормознул... суббота была ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2011, 17:37 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Так или иначе, выложи автор свой пример в виде файла, наверняка получил бы уже несколько конкретных решений. Шокер, не сочти это за критику в твой адрес. Твоя реплика тривиальна и(а значит) безусловно верна. Давайте подождем автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2011, 21:09 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо всем за советы...но у меня возникла идея совсем от ВПР отказаться...ибо долго он считает( мне так кажется)...проверял отключением авторасчета...и все мгновенно вставилось, но одно и то же (я формулу растягивал по диапазону)..В целом у меня дело обстоит так: Есть Файл №1. Так вот на листе 1 есть три таблицы. На листе 2 - только одна. На листе 3 как должно получиться. Таблица вида: 1 текст число 1 текст число 1 текст число 2 текст число 2 текст число 2 текст число 3 текст текст 3 текст текст Задача: Сделать выборку данных, затем автоматом их распихать по трем соответствующим таблицам ( для данных напротив 1 , 2 и 3) Затем удалить пустые строки и обрамить... Вопрос выборки сначала попробовал решить ВПР - но долго. - соответственно вопрос выборки - не решил)) Вопрос удаления строк - решил Вопрос обрамления - решил Так вот есть код Код: plaintext 1. 2. 3. 4. 5. 6. Так вот теперь самый главный вопрос: Как мне привязать номер строки к значению в первом столбце? чтобы Range("B1:D14") - был динамическим, а именно только последняя строка...тоесть (B1:Di ) где i Меняется в зависимости от значения в первом столбце.. может как то так, например для первой таблицы: пишу словами, т.к. не знаю как это выдать на языке VBA Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. вот...помогите теперь всё это на язык VBA перевести) файл приложил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 17:42 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Я толком не понял - что есть и что нужно получить? Как понял - есть данные на листе2 и пустые таблицы на листе1. Зачем пустые и нельзя ли их генерить макросом как нужно (чтоб не искать, что удалять)? Зачем вообще лист3 и что на нём уже есть, а что добавляется макросом (и зачем)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 17:57 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
... мне кажется, что можно сделать быстро на массивах и словаре/коллекции. Но объясните, что именно нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 18:22 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
на листе 3 - образец что должно получиться, так сказать наглядный пример. А нужно след.: Нужно данные из одной таблицы, рассортировать по трем разным таблицам. Из условия что в первую таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 1, во вторую таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 2, в третью таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 18:30 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
что значит на массивах и коллекциях/словарях? мне хочется запустить импорт данных одним нажатием кнопки...а это ж только макросом и можно сделать...вот сначала записал макрос с впр, но долго...руками быстрее...теперь пытаюсь осилить более оптимизированный код... Если есть решения ещё проще я бы был вам очень благодарен, если бы Вы меня направили в нужное русло...я не прошу мне код готовый прислать, мне в принципе самому интересно разобраться, хотя в программировании я полный профан...)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 19:29 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Hugo121... мне кажется, что можно сделать быстро на массивах и словаре/коллекции. Но объясните, что именно нужно. Я фигею. Игорь, ну наф... зачем? Почему не дать автору высказаться? Ты же умничка! Такое ощущение, что мне в пику делаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 19:37 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
kuklp, Привет Сергей ! Я для себя такой алгоритм нарисовал : ADO 2 рекордсета: 1 - группируем по F1 и заодно подсчитываем значения(для смещения диаапзона вставки) 2- делаем единый формат таблицы из 3 столбов затем перебираем 1 рекордсет, 1 значением фильтруем 2 рекордсет выгружаем на лист, берем значение из первого рекордсета и смещаем точку вставки следующей таблицы, так границы таблиц определены не составляет труда после вставки таблицы, отформатировать ее как надо.(добавить заголовки и стили) как то так, но писать лениво -Q ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 20:20 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Сергей, так я дал. Полчаса :) И всё равно до конца не понятно - эти значения 1, 2 и 3 - заранее известны, и по ним нужно отбирать? Столбцы A и B всегда заполнены, а числа могут быть или в C, или в D? Если так, то просто - исходные данные в массив (словарь не нужен), создаём ещё 3 пустых таких же по размеру, но на 3 столбца (или 6 на 1 столбец). И 3 переменных для подсчёта. Перебираем первый массив, анализируем первый столбец. Набираем данные в пустые массивы, считаем количество в каждом (т.е. используем индекс и для заполнения, и потом для выгрузки - это по одной переменной на массив или параллельную пару массивов). В итоге имеем 3 (или 6) массивов с данными, верхушку которых выгружаем куда нужно. Вопрос - куда нужно? Один под другим с промежутком в 2 строки или как? Ну а красоту и рамки потом можно навести - координаты данных будут известны. Find не нужен, один цикл не по листу, а по массиву - будет меньше секунды на 200 строк. Основное время вероятно натягивание рамок займёт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 20:26 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Дима, Игорь - чесслово - рад вам! Но еще Шокер в теме написал(см. сообщение №2). Помимо моей радости от увиденного, давайте братья подождем автора? П.С. Вы, безусловно, лучшие! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 20:38 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Geo28что значит на массивах? Код: 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. Чего уж ждать, раз написано? Не подойдёт ТС - может другим сгодится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 21:24 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Помарка, так нужно объявить: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 21:26 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Упс, ещё проглядел - 1, 2 и 3 ведь не нужно в массив забивать :( Тогда этот блок должен быть таким - 3 строки изменил, 3 удалил: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 22:05 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
ВЫ реально лучшие, СПАСИБО ВАМ ОГРОМНОЕ ЗА ПОМОЩЬ... Но я чесслово вообще ничего не понял))))) Все что связано с массивами))) Но это круто...То что вы так вот сходу такие темы лабаете - это круто...Респект)) Но позвольте, мне еще тогда раз все более подробно разъяснить, а то вижу что люди мне пытаются помочь, а я блин толком не могу рассказать что мне надо...Итак ещё раз о моей задаче: У меня есть файл, допустим он называется Книга1. В нем на первом листе есть таблицы, которые необходимо заполнить. Таблиц три штуки, идут они друг за другом, в конце каждой таблицы есть итог. (пример я прикрепил). Тоесть если в табличке в столбце числа идут 1,2,3 то в графе ИТОГ в конце будет их сумма - 6. Графа "Итог" должна быть в конце обязательно, поэтому я и сделал сначала в каждой таблице пустых строк с запасом, а потом просто их удалить по условию, что в них стоит "0" в графе число... Теперь как формируются данные на листе 2. Таблица всегда одного вида. НИКОГДА не меняются столбцы. Никогда не меняется условие отбора - это всегда числа в первом столбце либо 1, либо 2, либо 3. Но количество строк с каждым числом может меняться...В примере на листе 2 я привел пример...Нарисовал две таблицы какие они могут быть... Теперь что куда надо импортировать: Например для первой таблицы грубо говоря по аналогии с формулой впр: если в таблице на листе2 в столбце A:A, есть число 2, то нужно скопировать из этой строки данные их столбцов D и G в соответственно первую таблицу на первом листе в первую строку в столбцы A и D (как в прикрепленном примере) Руками я делаю так: выделяю массив данных все что напротив Числа 2 из первого столбца, потом Ctrl+C, перехожу на самую верхнюю и левую ячейку первой таблицы Ctrl+V...потом удалял пустые строки и обрамлял. Вот и все и так для каждой таблицы. Надеюсь что Вы меня поняли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 22:26 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Мне самое главное это тупо отобрать массив, это если бы я руками выделял по условию все напротив 1, 2 или 3 и тупо вставить в верхнюю левую ячейку соответствующей таблицы...Мне нельзя формировать таблицы с нуля...Есть форма, но она пустая, в ней набито пустых строк с запасом..., надо просто выделить отобранный массив и вставить, потом удалить пустые строки, и обрамить вставленный ранее массив, ну либо последнюю строку обрамить снизу( ну после которой идёт графа Итог). Мне кажется это самый простой вариант... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 22:36 |
|
||
|
Помогите ускорить код пожалуйста!
|
|||
|---|---|---|---|
|
#18+
Geo28, Примерно понятно. Не понятно, почему нельзя генерить таблицу? В ней ещё что-то есть? Столбец "Номер" вообще не учитывается? Итого можно сразу при заполнении массива считать - ещё 3 переменных для этого завести. Т.е. таблицы на первом листе легко генерить кодом, это просто. Сложнее сделать заливку - она и впрямь нужна? Лениво прописывать... :) И рамки тоже сложные - в первом варианте проще было. И объединение ячеек... Давайте это Вам домашнее задание? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 22:40 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=117&tid=2176354]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 375ms |

| 0 / 0 |
