|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Доброго времени суток, уважаемые форумчане! В макросах не силен, по статейкам в инете написал код. Смысл такой, что в таблицу сначала вставляется необходимое количество строк, затем из буфера обмена (ранее скопированного диапазона в excel) вставляется в диапазон ячеек таблицы word (выбирается таблица №3). Далее перебираются ячейки 3 столбца и при условии, что в ячейке 3 символа, копируется в буфер содержимое ячейки второго столбца, строка очищается, ячейки в строке объединяются и затем в строку вставляется ранее скопированное содержимое ячейки второго столбца, ну и для красоты ячейка затемняется. Проблема в том, что в случае, например, двухста строк код выполняется более менее быстро, а вот когда строк, например, две тысячи, код выполняется настолько долго, что через 15-20 минут, не дождавшись окончания, снимаю задачу диспетчером. Не могу понять, что можно предпринять для исправления. Код: 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.
Подскажите, пожалуйста, в чем ошибка в коде, существует ли способ ли ускорить его выполнение? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2021, 10:40 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Во-первых, тут очень много копирования в буфер. Это занимает очень много времени. По возможности, нужно избежать копирования в буфер, лучше копировать в переменную (если речь идет о значении, если, конечно, речь идет только о значении, а не о формулах, оформлении и прочем) Во-вторых, любое взаимодействие с ячейками листа тоже достаточно медленное. Поэтому, лучше минимально задействовать такое взаимодействие в цикле и активно использовать массивы, копируя и вставляя значения разом из массива / в массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2021, 10:58 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, большое Вам спасибо за отзыв. По первому пункту понятно в каком направлении работать, а на счет второго пункта я не совсем понял, каким образом должна происходить работа с массивом, разом копировать и вставлять, если по выполнению условия в ячейке изменяется строка. Буду очень благодарен, если немного подробней объясните как это должно работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 07:45 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 каким образом должна происходить работа с массивом, разом копировать и вставлять, если по выполнению условия в ячейке изменяется строка. Она изменяется, потому что там имеется зависимая формула? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 08:33 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, столкнулся с таким кейсом-нужно обработать таблицу с листа Excel через предварительное загнание её в массив, но для обработки нет необходимости загонять всю таблицу в массив- нужно только 2 столбца из 20 к примеру. Но быстрым методом копирования диапазона в массив Код: vbnet 1.
можно загнать только всю таблицу целиком в массив. Получается, чтобы заполнить массив только 2 столбцами, а не всей таблицей, нужно делать цикл по ячейкам, который медленнее, чем Range.Value и вручную их копировать в массив. Соответственно, можно ли несколько Range склеить в один массив без цикла по ячейкам? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:05 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
vb_sub Но быстрым методом копирования диапазона в массив можно загнать только всю таблицу целиком в массив. А указать в Range только нужные столбцы идея не приходила? типа Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:46 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Akina, Range это непрерывный диапазон, нельзя указать крайние столбцы и исключить некоторые промежуточные из них. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:51 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Akina, я может что то не понимаю, но у меня word и формулы в строке нет. Изменяется строка i (объединяются ячейки и в них вставляется текстовое значение из ячейки второго столбца), если в ячейке третьего столбца 3 символа ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:25 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
vb_sub Akina, Range это непрерывный диапазон Это не так. Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:27 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 у меня word Я не заметил слона! Думаю, что все вышестоящие ответы можно вычеркнуть. Автору - надо ЯВНО указывать среду разработки, но мы, конечно, тоже хороши! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:39 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, виноват, каюсь, в будущем учту замечание. И все же для word существует решение данной проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:27 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
С вордом всё сложнее, надо возиться и пробовать. Попробуй для начала убрать работу с буфером внутри цикла. Может это решит проблему до приемлемой скорости. ЗЫ: Лучше работать с ThisDocument вместо ActiveDocument ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:19 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, спасибо за ответы с наводками. Использовал переменную внутри цикла вместо буфера, скорость выполнения кода действительно возрасла. Теперь хотя бы на двух тысячах строках можно дождаться завершения работы макроса. Код выглядит так: Код: 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.
Но возникла проблема, что после вставленной переменной отрабатывается Enter и ячейка становится как бы двустроковой. Можно этого как то избежать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 21:09 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Для начала отформатируем, чтобы хоть читать код можно было Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 21:23 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Попробуй копировать в переменную не .Range а .Range.Text ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 21:24 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, таким вот образом не помогло: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Все-равно откуда то присутствует символ "конец абзаца" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 08:12 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Ну значит надо его грохнуть прям в переменной ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 09:46 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
vb_sub Range это непрерывный диапазон, нельзя указать крайние столбцы и исключить некоторые промежуточные из них. Можно использовать несколько Range, по одному на каждую необходимую колонку. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 11:39 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, несколько другим способом пытаюсь решить проблему скорости выполнения цикла. Как Вы и советовали, отказался от копирования в буфер внутри цикла. Получился код: Код: 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.
В нем в строке, найденной по условию, сначала объединяются ячейки; в объединенной ячейке остается содержимое второй ячейки с множеством скрытых символов, которые обрезаются; в итоге как плюс - не сбивается форматирование. Скорость выполнения кода заметно выше, но все-равно когда строк две тысячи выполняется он очень долго. Не могу разобраться как работать с ThisDocument. Если с ним работать тоже должен быть прирост скорости? Есть еще варианты над чем поработать? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 01:38 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
можно еще ускорить, избавившись от двойного обращения к .Rows(i).Range чтобы ускорять еще - скорее всего уже нужно менять подход в принципе, а может это уже будет невозможно. Без файла образца сложно что-то сказать ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 07:22 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, двойное обращение к .Rows(i).Range исключил. Вставил таймер, цикл по обработке двух тысяч строк выполняется 85 сек. Код: 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. 31. 32. 33.
Прилагаю файлы для примера. В таблице excel нажимаю кнопку "копировать в буфер", в word выполняю код. Т.к. два файла приложить не могу, поэтому выложил в архиве. Предполагаю, что можно сократить время, если передавать таблицу из excel в word напрямую, но как это сделать пока не знаю, да и все-таки основное время уходит на обработку строк в цикле, вот его бы ускорить ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2021, 23:24 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro чтобы ускорять еще - скорее всего уже нужно менять подход в принципе, а может это уже будет невозможно. Shocker.Pro, в чем может заключаться подход с другой стороны, имеется ввиду отказаться от цикла перебора ячеек? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 13:57 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Я поэкспериментировал с этим кодом. Даже если просто убрать все внутренности цикла, тормозит сама проверка Код: vbnet 1.
Попытки обращения к ячейке другими способами результата особо не дали. Я не знаю, какие у тебя возможности есть при манипуляции экселем, кроме копипасты По большому счету, нужно заранее вычислить номера строк для объединения ячеек ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 14:29 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, большое спасибо Вам за помощь и быстрые ответы. Может я делаю это криво, но в экселе, я специально ввожу в ячейку 3 символа, чтобы определить строку в которой нужно объединить ячейки, т.е. эти три символа в ячейке третьего столбца работают как маркер. Может есть какие то другие способы, более быстрые, по которым определить строку, в которой объединить ячейки? А про определение номеров строк для объединения в самом экселе... у меня в голове витала такая идея. Но она для меня какая то фантастическая. В самом экселе определить номера строк для определения сложностей нет (например, через те же три символа в ячейке), но фактически передать в ворд номера строк для объединения не представляю как реализовать. Количество строк и номера строк могут быть абсолютно разные. В экселе нужно выделить ячейку (диапазон) для номеров строк или как то через переменные эти номера передавать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 15:34 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 я специально ввожу в ячейку 3 символа ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 15:38 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, програмно, пытаюсь автоматизировать как можно больше... добавляю два пробела спереди и сзади к значениям (для центирования), а когда значение пусто, то в ворде присутствует третий скрытый символ ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 16:20 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
А сам эксель тут для чего вообще? Может опишешь весь процесс, потому что раз не получилось локально оптимизировать цикл, надо расширять горизонты. К примеру, можно управлять экселем из ворда, можно вордом из экселя, можно вордом забирать данные минуя буфер обмена, из БД сразу, или, к примеру, забирать с листа экселя как из БД через ADODB. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 16:26 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, в эксел вводятся исходные данные, происходит их обработка с помощью формул и макросов, полученные данные выстраиваются в итоговом виде, далее в экселе нажимаю кнопку, которая необходимый диапазон ячеек копирует в буфер, запускаю готовую форму (заполнены прочие данные) в ворде, в нем запускаю данный код, заполняется и форматируется (объединяются ячейки где необходимо) таблица и т.о. формируется готовый отчет. Основная работа происходит в экселе, в ворд отправляются готовые данные и проставляется номер страниц. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2021, 18:26 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Хорошо, если данные готовятся в экселе с помощью макросов, почему бы не объединить ячейки в экселе до копирования? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 00:44 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, не совсем удобно объединять ячейки в экселе, т.к. объединение будет макросом, не будет отмены действия, а содержимое ячеек с формулами динамическое и все может изменяться на любом этапе. Либо макросом после объединения ячеек и копирования в буфер в нем же сразу и возвращать исходный вид ячеек. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 06:03 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, попробовал вручную скопировать в ворд объединенные в экселе ячейки. Не работает, ворд объединенные ячейки воспринимает как одну ячейку и соответственно в выделенный диапазон для вставки просто дублирует в каждую ячейку содержимое буфера. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 09:03 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
А у меня нормально прошло именно на твоих файлах ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 10:00 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, извини, а как ты делал? Я в экселе ячейку Ctrl+C, в ворде выделяю в строке ячейки и выполняю Ctrl+V; и во всех выделенных в строке ячейках продублировано содержимое исходной ячейки эксел. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 10:16 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
я объединяю ячейки в экселе и нажимаю кнопку. В ворде ничего не выделяю, просто вставляю ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 10:22 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Есть еще такая штука как "слияние данных" Я с ней сам не работал По идее как раз и предназначена для твоих целей, но не знаю, удовлетворит ли в нужной мере ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 10:50 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, я понял, данные из буфера вставляются не в таблицу, а вставляется сама таблица целиком. Вариант интересный, но, так понимаю, нужно будет задавать позицию курсора для вставки и форматировать вставленную таблицу (задавать ширину столбцов и т.п.). Интересным еще представляется вариант с передачей из эксела в ворд номеров строк для объединения ячеек. Ведь тогда будут общие переменные для ворда и эксела и можно сделать, чтобы по нажатию кнопки в экселе таблица вставлялась в ворд без дополнительного запуска макроса в ворде. Но как это сделать пока не знаю, нужно изучать вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 11:20 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 Вариант интересный, но, так понимаю, нужно будет задавать позицию курсора для вставки и форматировать вставленную таблицу (задавать ширину столбцов и т.п.). Markovich21 по нажатию кнопки в экселе таблица вставлялась в ворд без дополнительного запуска макроса в ворде. Смысл в том, что Эксель создает объект Word-а и может им управлять в такой же мере, как ты это делаешь с помощью макроса самого Ворда. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 11:31 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, еще раз большое спасибо. Правильно понимаю, что второй вариант с управлением вордом из эксела более оптимальный? Если да, буду его изучать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 12:22 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Понятие "оптимальный" зависит от того, как будет развиваться твой проект и сколько времени ты можешь этому посвятить. Если нужно быстро доделать и забыть - то первый вариант. Второй вариант более гибкий, более перспективный (кстати, с тем же успехом можно управлять экселем из ворда), но потребует времени и экпериментов. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 12:25 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
я в отпуск, заглядывать-то буду, но времени вдумчиво отвечать и экспериментировать, не будет, так что очень рассчитываю, что коллеги помогут в этом топике ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 17:34 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, еще раз спасибо, буду по-возможности разбираться со вторым вариантом, он мне нравится. Хорошего качественного и душевного отдыха! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2021, 23:03 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro Я поэкспериментировал с этим кодом. Даже если просто убрать все внутренности цикла, тормозит сама проверка Код: vbnet 1.
Попытки обращения к ячейке другими способами результата особо не дали. Я не знаю, какие у тебя возможности есть при манипуляции экселем, кроме копипасты По большому счету, нужно заранее вычислить номера строк для объединения ячеек Индексированные свойства тормозят. Потому что при обращении по индексу где-то внутри происходит перебор. Чтобы не тормозило, нужно использовать for each. Кроме того Cells это Range и есть, в Cells.Range смысла нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2021, 12:09 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Доброго времени суток, уважаемые форумчане! Последовав рекомендациям, подошел с другой стороны к решению вопроса копирования таблицы из excel в word с форматированием определенных строк по условию. Выгрузка в word осуществляется по нажатию кнопки "заполнить таблицу word" в экселе, строки для форматирования определяются в экселе и передаются в ворд. Т.о. таблица величиной 2000 строк передается в ворд значительно быстрее, за 37сек (в предыдущем варианте в ворде код выполнялся 87сек). Т.к. в макросах не силен совсем, прошу посмотреть представленный ниже код на предмет корректности написания и может что то в нем можно оптимизировать и ускорить. И еще, ответьте, пожалуйста, на вопрос можно ли таблицу передавать в ворд в виде переменной (предполагаю, что с помощью переменной передача в ворд будет происходить еще быстрее)? Сам попытался выгрузить с помощью переменной, ничего не получилось. В качестве примера прикладываю архив с двумя файлами ("источник" эксел и "приемник" ворд). Заранее спасибо. Код: 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. 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. 77.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 11:51 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:00 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, авторэто очень плохая идея что в этом плохого? после того как закомментировал эту строку вывалилась ошибка в: Код: vbnet 1.
значит это место нужно переработать, а смысл доработки есть или все-таки оставить Код: vbnet 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:23 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
перед этой строкой On Error Resume Next Markovich21 вывалилась ошибка в: Код: vbnet 1.
Markovich21 что в этом плохого? Ошибки должны обрабатываться корректно, анализироваться. А ты взял и заглушил все ошибки, типа "я не вижу проблемы, значит её и не существует" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:42 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:44 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro Markovich21 Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:45 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 что то в нем можно оптимизировать и ускорить. Возможно, быстрее будет скопировать в ворд таблицу целиком, а потом объединить только нужные ячейки, которые вычислены заранее, как я и предлагал ранее ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 12:48 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, про Код: vbnet 1.
и Код: vbnet 1.
понял, спасибо за замечание. А вот с авторВозможно, быстрее будет скопировать в ворд таблицу целиком, а потом объединить только нужные ячейки, которые вычислены заранее, как я и предлагал ранее я не понял, что имеется ввиду. В коде работает вроде бы так: в экселе таблица копируется в буфер, затем в ворде вставляется таблица целиком, а затем объединяются строки по списку из экселя (номера строк берутся из небольшого цикла) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 19:27 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
я вижу копипасту внутри цикла Markovich21 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 19:32 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, тут работает таким образом, что таблица в ворд уже полностью вставлена, а t номер строки (берущийся из экселя), в которой нужно объединить ячейки. Сначала какое то общее наименование (оно находится во втором столбце), которое должно быть в объединенной строке копируется в буфер, ячейки строки очищаются, объединяются и наименование вставляется обратно в уже объединенную ячейку. У меня родился такой вот алгоритм работы, другой как то в голове не складывается. Можно как то по другому лучше сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2021, 20:39 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, Скажите, пожалуйста, вставить диапазон ячеек в таблицу ворд, не используя буфер обмена, а через переменную теоретически возможно? у меня при попытках что то подобное сделать выпадают либо ошибки, либо ничего не вставляется, хотя по одной ячейке вставка в ячейку таблицы ворд через переменную происходит без проблем. Предполагаю, что выделение диапазона ячеек в ворде таким образом: Код: vbnet 1.
не подходит для вставки переменной. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2021, 10:08 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Вставить текст можно через переменную или прямо напрямую, присвоив значение свойства Text. Но форматирование не сохранится ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2021, 12:08 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Но вообще я этот код тестировал на прошлой неделе, там львиная часть времени уходит не на цикл, а на вставку приличного размера данных из буфера обмена ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2021, 12:11 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, спасибо за помощь. по Вашему совету избавился от копирования в цикле, использовав переменную и массив. Никак не получается вставлять данные минуя буфер обмена (через переменную), значение свойства Text. применять пробовал. Подскажите, пожалуйста, имеет ли смысл пытаться вставлять данные через переменную, будет ли на этом прирост скорости? На данный момент рабочий код выглядит так: Код: 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. 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. 77. 78. 79. 80.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 13:10 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Через переменную можно перенести текст, но не полностью набор ячеек и строк со всем форматированием и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 13:21 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, создаю переменную: Код: vbnet 1.
вместо копирования в буфер строка: Код: vbnet 1.
и в строке ошибка: Код: vbnet 1.
Получается сделал я примерно так как работало бы в экселе. С вордом так не работает, как Вы говорите, передается только текст. Еще помимо вставки из буфера значимую часть времени занимает объединение ячеек, что тоже, наверное, не ускоришь. Выходит, что в плане оптимизации и увеличения скорости больше особо ничего не выжмешь и можно оставить код как есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 14:04 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Markovich21 Получается сделал я примерно так как работало бы в экселе. С вордом так не работает, как Вы говорите, передается только текст. Markovich21 Выходит, что в плане оптимизации и увеличения скорости больше особо ничего не выжмешь и можно оставить код как есть? Antonariy Индексированные свойства тормозят. Потому что при обращении по индексу где-то внутри происходит перебор. Чтобы не тормозило, нужно использовать for each. Можно покурить "слияние", оно вроде как предназначено для того, чтобы перекидывать данные в такой ситуации. Сам не работал с ним. Можно попытаться работать со стороны Ворда (то есть чтобы код был не в экселе, а в ворде, затянуть данные из экселевского файла через ADODB, обработать их в памяти и вывести в таблицу) Можно сформировать html-файл и открыть его в ворде. Я делал так универсальные отчеты, которые можно было открывать в браузере, ворде и экселе, при этом они выглядели более-менее одинаково. Там, правда, очень странная интерпретация html, например в тэге в атрибуте класса может быть только один класс, остальные игнорируются, поэтому для документа приходилось создавать персональную таблицу классов, но в целом удавалось объединять и раскрашивать ячейки таблицы и осуществлять кое-какое форматирование Так что есть куда копать, всё зависит от времени и желания ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 15:26 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
Shocker.Pro, спасибо, за наметки. Запуск макроса со стороны ворда отпадает, под мой случай не подходит, а вот другие варианты буду изучать ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 17:48 |
|
Очень долгий перебор строк в цикле
|
|||
---|---|---|---|
#18+
В конце-концов можно напрямую формировать docx-файл, так как это просто zip-архив с кучкой xml-внутри. Но без какой-нибудь OpenXML-библиотеки, которая упростит формирование файлов - это адский труд. Да и с библиотекой не сахар, в общем-то. Зато это точно будет самый быстрый вариант )) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 18:22 |
|
|
start [/forum/topic.php?fid=60&tid=2154713&all=1]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 419ms |
0 / 0 |