powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Очень долгий перебор строк в цикле
25 сообщений из 62, страница 2 из 3
Очень долгий перебор строк в цикле
    #40079888
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, програмно, пытаюсь автоматизировать как можно больше... добавляю два пробела спереди и сзади к значениям (для центирования), а когда значение пусто, то в ворде присутствует третий скрытый символ
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40079891
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сам эксель тут для чего вообще? Может опишешь весь процесс, потому что раз не получилось локально оптимизировать цикл, надо расширять горизонты.
К примеру, можно управлять экселем из ворда, можно вордом из экселя, можно вордом забирать данные минуя буфер обмена, из БД сразу, или, к примеру, забирать с листа экселя как из БД через ADODB.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40079923
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, в эксел вводятся исходные данные, происходит их обработка с помощью формул и макросов, полученные данные выстраиваются в итоговом виде, далее в экселе нажимаю кнопку, которая необходимый диапазон ячеек копирует в буфер, запускаю готовую форму (заполнены прочие данные) в ворде, в нем запускаю данный код, заполняется и форматируется (объединяются ячейки где необходимо) таблица и т.о. формируется готовый отчет. Основная работа происходит в экселе, в ворд отправляются готовые данные и проставляется номер страниц.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40079994
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, если данные готовятся в экселе с помощью макросов, почему бы не объединить ячейки в экселе до копирования?
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080008
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, не совсем удобно объединять ячейки в экселе, т.к. объединение будет макросом, не будет отмены действия, а содержимое ячеек с формулами динамическое и все может изменяться на любом этапе. Либо макросом после объединения ячеек и копирования в буфер в нем же сразу и возвращать исходный вид ячеек.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080020
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, попробовал вручную скопировать в ворд объединенные в экселе ячейки. Не работает, ворд объединенные ячейки воспринимает как одну ячейку и соответственно в выделенный диапазон для вставки просто дублирует в каждую ячейку содержимое буфера.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080032
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у меня нормально прошло именно на твоих файлах
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080041
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, извини, а как ты делал? Я в экселе ячейку Ctrl+C, в ворде выделяю в строке ячейки и выполняю Ctrl+V; и во всех выделенных в строке ячейках продублировано содержимое исходной ячейки эксел.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080043
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я объединяю ячейки в экселе и нажимаю кнопку.

В ворде ничего не выделяю, просто вставляю
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080053
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще такая штука как "слияние данных"
Я с ней сам не работал
По идее как раз и предназначена для твоих целей, но не знаю, удовлетворит ли в нужной мере
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080070
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, я понял, данные из буфера вставляются не в таблицу, а вставляется сама таблица целиком. Вариант интересный, но, так понимаю, нужно будет задавать позицию курсора для вставки и форматировать вставленную таблицу (задавать ширину столбцов и т.п.). Интересным еще представляется вариант с передачей из эксела в ворд номеров строк для объединения ячеек. Ведь тогда будут общие переменные для ворда и эксела и можно сделать, чтобы по нажатию кнопки в экселе таблица вставлялась в ворд без дополнительного запуска макроса в ворде. Но как это сделать пока не знаю, нужно изучать вопрос
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080076
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Markovich21
Вариант интересный, но, так понимаю, нужно будет задавать позицию курсора для вставки и форматировать вставленную таблицу (задавать ширину столбцов и т.п.).
это будет работать гораздо быстрее перебора

Markovich21
по нажатию кнопки в экселе таблица вставлялась в ворд без дополнительного запуска макроса в ворде.
Ищи по форуму CreateObject("Word.Application"), нароешь миллион примеров

Смысл в том, что Эксель создает объект Word-а и может им управлять в такой же мере, как ты это делаешь с помощью макроса самого Ворда.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080097
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, еще раз большое спасибо. Правильно понимаю, что второй вариант с управлением вордом из эксела более оптимальный? Если да, буду его изучать.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080101
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятие "оптимальный" зависит от того, как будет развиваться твой проект и сколько времени ты можешь этому посвятить.
Если нужно быстро доделать и забыть - то первый вариант. Второй вариант более гибкий, более перспективный (кстати, с тем же успехом можно управлять экселем из ворда), но потребует времени и экпериментов.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080184
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я в отпуск, заглядывать-то буду, но времени вдумчиво отвечать и экспериментировать, не будет, так что очень рассчитываю, что коллеги помогут в этом топике
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40080233
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, еще раз спасибо, буду по-возможности разбираться со вторым вариантом, он мне нравится. Хорошего качественного и душевного отдыха!
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40081771
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Я поэкспериментировал с этим кодом. Даже если просто убрать все внутренности цикла, тормозит сама проверка
Код: vbnet
1.
.Cell(i, 3).Range.Characters.Count = 3


Попытки обращения к ячейке другими способами результата особо не дали.

Я не знаю, какие у тебя возможности есть при манипуляции экселем, кроме копипасты
По большому счету, нужно заранее вычислить номера строк для объединения ячеек

Индексированные свойства тормозят. Потому что при обращении по индексу где-то внутри происходит перебор. Чтобы не тормозило, нужно использовать for each.

Кроме того Cells это Range и есть, в Cells.Range смысла нет.
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083202
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые форумчане! Последовав рекомендациям, подошел с другой стороны к решению вопроса копирования таблицы из 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.
Sub ToWordTbl()

tm = Timer

    With Application
        .ScreenUpdating = False
    End With
On Error Resume Next

Dim WrdApp As Word.Application
Dim WrdDoc As Word.Document
Dim WrdTbl As Word.Table
Dim DocPath As String
Dim n As Integer, k As Integer, r As Integer, s As Integer, t As Integer
    With Worksheets("Лист1")
        n = .Range("A10")
        k = n - 1
        r = n + 1
        s = .Range("J10") + 9
        .Cells(11, 1).Resize(n, 5).Copy
    End With
    
    DocPath = ThisWorkbook.Path & "\"
    
    Set WrdApp = GetObject(, "Word.Application")
        If WrdApp Is Nothing Then Set WrdApp = CreateObject("Word.Application")
    Set WrdDoc = WrdApp.Documents.Open(DocPath & "Приемник.docx")
        If WrdDoc Is Nothing Then Set WrdDoc = WrdApp.Documents.Open(DocPath & "Приемник.docx")
    
    WrdApp.Visible = False
    
        If Dir(DocPath & "Приемник.docx") = "" Then
            MsgBox "Файл ""Приемник.docx"" отсутствует"
            WrdApp.Visible = True
            Exit Sub
        End If
      
    Set WrdTbl = WrdDoc.Tables(3)
    With WrdTbl

        If .Rows.Count > 2 Then
            MsgBox "Ошибка шаблона ""Приемник""."
            Application.CutCopyMode = False
            WrdApp.Visible = True
            Exit Sub
        End If
        
        .Rows(2).Select
            
        WrdApp.Selection.InsertRowsBelow k
        
        WrdDoc.Range(.Cell(2, 2).Range.Start, .Cell(r, 6).Range.End).PasteAndFormat (16)

        .Rows(1).Borders(wdBorderBottom).LineStyle = wdLineStyleDouble
        .Rows(r).Borders(wdBorderBottom).LineStyle = wdLineStyleDouble
               
        For i = 10 To s
            t = ThisWorkbook.Worksheets("Лист1").Cells(i + 1, 10) + 1
            
            .Cell(t, 2).Range.Copy
            WrdDoc.Range(.Cell(t, 1).Range.Start, .Cell(t, 6).Range.End).Delete
            .Cell(t, 1).Merge MergeTo:=WrdApp.ActiveDocument.Tables(3).Cell(t, 6)
            .Cell(t, 1).Range.PasteAndFormat (16)
        Next

    End With

    With Application
        .CutCopyMode = False
        .ScreenUpdating = True
    End With

WrdApp.Visible = True

MsgBox Timer - tm, 64

End Sub
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083203
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Markovich21
Код: vbnet
1.
On Error Resume Next

это очень плохая идея
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083207
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
авторэто очень плохая идея
что в этом плохого? после того как закомментировал эту строку вывалилась ошибка в:
Код: vbnet
1.
Set WrdApp = GetObject(, "Word.Application")


значит это место нужно переработать, а смысл доработки есть или все-таки оставить
Код: vbnet
1.
On Error Resume Next

?
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083210
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перед этой строкой On Error Resume Next
Markovich21
вывалилась ошибка в:
Код: vbnet
1.
Set WrdApp = GetObject(, "Word.Application")

после On Error Goto 0


Markovich21
что в этом плохого?
в том, что ты запретил все ошибки во всем коде, прога будет пытаться работать до последнего, пользователь не узнает, что, например, не все нужные строки скопировались, в худшем случае прога не дойдет до конца, скрытый ворд будет висеть в процессах и т.д. и т.п. Да и с отладкой ты замучаешься.
Ошибки должны обрабатываться корректно, анализироваться. А ты взял и заглушил все ошибки, типа "я не вижу проблемы, значит её и не существует"
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083211
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Markovich21
Код: vbnet
1.
           Exit Sub

а кто будет ScreenUpdating на место возвращать? Пользователь сильно удивится
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083212
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Markovich21
Код: vbnet
1.
           Exit Sub


а кто будет ScreenUpdating на место возвращать? Пользователь сильно удивится
кстати, а зачем ты ScreenUpdating выключаешь на экселе? Ты же вроде ничего не меняешь в экселевском файле?
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083214
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Markovich21
что то в нем можно оптимизировать и ускорить.
ты сейчас в цикле насилуешь буфер обмена, это не быстрая операция

Возможно, быстрее будет скопировать в ворд таблицу целиком, а потом объединить только нужные ячейки, которые вычислены заранее, как я и предлагал ранее
...
Рейтинг: 0 / 0
Очень долгий перебор строк в цикле
    #40083249
Markovich21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, про
Код: vbnet
1.
ScreenUpdating

и
Код: vbnet
1.
On Error Resume Next

понял, спасибо за замечание. А вот с авторВозможно, быстрее будет скопировать в ворд таблицу целиком, а потом объединить только нужные ячейки, которые вычислены заранее, как я и предлагал ранее я не понял, что имеется ввиду. В коде работает вроде бы так: в экселе таблица копируется в буфер, затем в ворде вставляется таблица целиком, а затем объединяются строки по списку из экселя (номера строк берутся из небольшого цикла)
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Очень долгий перебор строк в цикле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (11): Анонимы (8), Yandex Bot, Google Bot 2 мин., Bing Bot 3 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]