powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вывод отчёта в ворд средствами vba
17 сообщений из 17, страница 1 из 1
Вывод отчёта в ворд средствами vba
    #38476132
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь выгрузить данные запрса в ворд. Открываю существующий файлик, ляпаю в нём табличку и создавая параграфы в каждой ячейке пишу туда соответствующие данные запроса.
Сам процесс занимает афигительно много времени при количестве записей больше 30-ти. При этом загрузка проца процессом WINWORD.EXE 45-55%. При чём это даже при отключении визуализации выгрузки
Выгружают так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 Set wr = CreateObject("Word.Application")
 Set dc = wr.Documents.Open(path)
 With dc
  .Paragraphs(.Paragraphs.Count).Range.InsertParagraphAfter
  .Tables.Add Range:=.Range(Start:=.Paragraphs(.Paragraphs.Count).Range.Start, _
    End:=.Paragraphs(.Paragraphs.Count).Range.End), numrows:=2, numcolumns:=20
  k=1
  Set q = CurrentDb.QueryDefs("Запросик")
   q.Parameters("Параметр_формы") = Параметр_формы
   Set tbl = q.OpenRecordset
  With .Tables(1)
   While Not tbl.EOF
    .Cell(1 + k, 2).Range.InsertParagraph
    .Cell(1 + k, 2).Range.Paragraphs(1).Range.Text = tbl!fio
    k=k+1
   Wend
  End With
 End With



Вопрос: есть ли способ выгружать данные в ворд быстрее? Ведь если сделать отчёт во внутреннем формате Акса и произвести операцию Сервис - Связи с Офис - Публикация в Microsoft Office Word, то 500 записей перекидываются в ворд без проблем за 5 секунд с форматированием. Выравнивание текста, конешн, идёт не таблицей, а табуляцией, но чёт думаю и таблицей можно выводить быстро или нет?
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476151
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kar-karich,

Код: vbnet
1.
2.
3.
4.
While Not tbl.EOF
      .Cell(1 + k, 2).Range.Text = tbl!fio
    k=k+1
   Wend
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476157
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kar-karich,

хотя --где чтение очередной записи
если в выборке есть записи

While Not tbl.EOF
.Cell(1 + k, 2).Range.InsertParagraph
.Cell(1 + k, 2).Range.Paragraphs(1).Range.Text = tbl!fio
k=k+1
''''''''''''''''''''''''''''''чтение
Wend
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476223
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА, да есть там переход на новую запись. просто проца оч большая и однотипная. всю копировать сюда не стал. сам факт вывода первых 200 записей зафиксирован ... в течение 20 минут.
Как я понимаю, сама технология вывода таким образом медленная. Вот и вопрос: есть ли технология быстрее? мож отключить чего нужно кроме визуализации. Ну и загрузка процессора по 50% при передаче обычных текстовых строк ... это ж просто капец! не Война и Мир ж каждой строке. Там больше половины ячеек просто Да или Нет
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476327
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kar-karichВопрос: есть ли способ выгружать данные в ворд быстрее?
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476426
kar_karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112kar-karichВопрос: есть ли способ выгружать данные в ворд быстрее?
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476460
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kar_karichqwerty112пропущено...

если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?
имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476479
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112kar_karichпропущено...

ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?
имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом
тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476491
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kar-karichqwerty112пропущено...

имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом
тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?
нуу, могу и повторить, мне не жалко
qwerty112если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
т.е., в Аксе будет что-то типа такого
Код: vbnet
1.
2.
3.
4.
Set wr = CreateObject("Word.Application")
wr.Run "MyBeautifulMacro", "<путь к БД>" ' 
' wr.Quit ' если не нужно будет выводить полученный файл на экран
Set wr = nothing
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476511
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112kar-karichпропущено...

тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?
нуу, могу и повторить, мне не жалко
qwerty112если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
т.е., в Аксе будет что-то типа такого
Код: vbnet
1.
2.
3.
4.
Set wr = CreateObject("Word.Application")
wr.Run "MyBeautifulMacro", "<путь к БД>" ' 
' wr.Quit ' если не нужно будет выводить полученный файл на экран
Set wr = nothing


тык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476536
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kar-karichтык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений
"цэтирую"
С.Форт, Т.Хоун, Д.Релстон : Access 2000, Энциклопедия пользователя... код автоматизации быстрее всего выполняется на сервере автоматизации. Другими словами, при автоматизации объектов, свойств и методов Word, код VBA должен быть помещён в шаблоны Word, а не скопирован в Access.
...
Выполнение кода в Word происходит гораздо быстрее, поскольку отпадает необходимость в перекрёстной связи для каждой инструкции автоматизации. Если код находится в Word, код VBA выполняется в рамках одного процесса.
я этим "дядькам" - верю :)
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476602
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kar-karich,

авторSet q = CurrentDb.QueryDefs("Запросик")
q.Parameters("Параметр_формы") = Параметр_формы

откуда Запросик берет данные -----------сеть,локалка
а вы уж очень сократили код

я запустила циклом на 500 записей --какие-секунды(таблица локальная)
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476725
kar-karichесть ли способ выгружать данные в ворд быстрее? Есть.
1. Метод InsertDatabase объекта Range. Но ваш запрос с параметром здесь не пройдет. Нужно указывать текст запроса, в котором вместо параметра указывать значение явно.
2. Откыть ADODB.Recordset, его методом GetString получить и вставить в документ текст с разделителями, а затем методом ConvertToTable объекта Range преобразовать в таблицу.
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38476758
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112kar-karichтык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений
"цэтирую"
С.Форт, Т.Хоун, Д.Релстон : Access 2000, Энциклопедия пользователя... код автоматизации быстрее всего выполняется на сервере автоматизации. Другими словами, при автоматизации объектов, свойств и методов Word, код VBA должен быть помещён в шаблоны Word, а не скопирован в Access.
...
Выполнение кода в Word происходит гораздо быстрее, поскольку отпадает необходимость в перекрёстной связи для каждой инструкции автоматизации. Если код находится в Word, код VBA выполняется в рамках одного процесса.
я этим "дядькам" - верю :)
попробую позже. ща уж не до того. спасибо)
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38477572
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kar-karich,

столкнулся тоже с такой же проблемой недавно , как у ТС, необходимо было по шаблону создать word документ,содержащий закладки и таблицу, в таблицу надо было вывести порядка 17000 строк из рекордсета. Сначала решал задачу с помощью кода, аналогичного, приведенному ТС, ждал минут 40, не дождался. Помог метод, приведенный Гетцом (документ сформировался за две минуты на маломощном ПК)

Код: 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.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
' From Access 2002 Desktop Developer's Handbook
' by Litwin, Getz, and Gunderloy (Sybex)
' Copyright 2001. All Rights Reserved.
    
Option Compare Database
Option Explicit

Function CreateTableFromRecordset( _
 rngAny As Word.Range, _
 rstAny As ADODB.Recordset, _
 Optional fIncludeFieldNames As Boolean = False) _
 As Word.Table

    Dim objTable As Word.Table
    Dim fldAny As ADODB.Field
    Dim varData As Variant
    Dim strBookmark As String
    Dim cField As Long

    ' Get the data from the recordset
    varData = rstAny.GetString()
    
    ' Create the table
    With rngAny
    
        ' Creating the basic table is easy,
        ' just insert the tab-delimted text
        ' add convert it to a table
        .InsertAfter varData
        Set objTable = .ConvertToTable()
        
        ' Field names are more work since
        ' you must do them one at a time
        If fIncludeFieldNames Then
            With objTable
            
                ' Add a new row on top and make it a heading
                .Rows.Add(.Rows(1)).HeadingFormat = True
                
                ' Iterate through the fields and add their
                ' names to the heading row
                For Each fldAny In rstAny.Fields
                    cField = cField + 1
                    .Cell(1, cField).Range.Text = fldAny.Name
                Next
            End With
        End If
    End With
    Set CreateTableFromRecordset = objTable
End Function

Sub PrintInvoiceWithWord(frmOrder As Form_Orders)
    Dim objWord As Word.Application
    Dim rst As Recordset
    Dim strSQL As String
    
    ' Launch Word and load the invoice template
    Set objWord = New Word.Application
    objWord.Documents.Add _
     Application.CurrentProject.Path & "\Invoice.dot"
    objWord.Visible = True
    
    ' Add header information using predefined bookmarks
    With objWord.ActiveDocument.Bookmarks
        .Item("OrderID").Range.Text = frmOrder.OrderID
        .Item("OrderDate").Range.Text = frmOrder.OrderDate
        .Item("CompanyName").Range.Text = frmOrder.CompanyName
        .Item("Address").Range.Text = frmOrder.Address
        .Item("Address2").Range.Text = frmOrder.City & ", " & _
         frmOrder.Region & " " & frmOrder.Country & " " & _
         frmOrder.PostalCode
    End With
    
    ' Build SQL string for details
    strSQL = "SELECT [Product Name], [Unit Price], Quantity, " & _
     "Disc, Extended FROM [Order Details Formatted] " & _
     "WHERE OrderID = " & frmOrder.OrderID
    
    ' Get details from database and create a table
    ' in the document
    Set rst = New Recordset
    rst.Open strSQL, CurrentProject.Connection
    With CreateTableFromRecordset( _
     objWord.ActiveDocument.Bookmarks("Details").Range, rst, True)
     
        ' Add rows for subtotal, freight, total
        With .Rows.Add
            .Cells(1).Range.Text = "Subtotal"
            .Cells(5).Range.Text = _
             FormatCurrency(frmOrder.Subtotal)
        End With
        With .Rows.Add
            .Cells(1).Range.Text = "Freight"
            .Cells(5).Range.Text = _
             FormatCurrency(frmOrder.Freight)
        End With
        With .Rows.Add
            .Cells(1).Range.Text = "Total"
            .Cells(5).Range.Text = _
             FormatCurrency(frmOrder.Total)
        End With
        
        ' Apply formatting
        .AutoFormat wdTableFormatProfessional
        .AutoFitBehavior wdAutoFitContent
        
        ' Fix up paragraph alignment
        .Range.ParagraphFormat.Alignment = wdAlignParagraphRight
        .Columns(1).Select
        objWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
        objWord.Selection.MoveDown
    End With
    
    ' We're done
    Set objWord = Nothing
End Sub
...
Рейтинг: 0 / 0
Вывод отчёта в ворд средствами vba
    #38778716
kar-karich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
метод, обозначенный qwerty112 работает так же медленно. Сделал через вывод результата запроса методом OutputTo. Потом открыл файл и добавил форматирование программно. Скорость вывода увечилась в разы. 10 минут уложились в секунд 30
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вывод отчёта в ворд средствами vba
    #39768940
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport17000 строк из рекордсета
не всякий комп откроет таблицу в 250-300 страниц
у меня как-то была такая потребность --выводила псевдо -таблицей(по сути гладкий текст и псевдо-графика

этот объем --для EXCEL
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вывод отчёта в ворд средствами vba
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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