Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вывод отчёта в ворд средствами vba / 17 сообщений из 17, страница 1 из 1
25.11.2013, 07:52
    #38476132
kar-karich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
Пытаюсь выгрузить данные запрса в ворд. Открываю существующий файлик, ляпаю в нём табличку и создавая параграфы в каждой ячейке пишу туда соответствующие данные запроса.
Сам процесс занимает афигительно много времени при количестве записей больше 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
25.11.2013, 08:55
    #38476151
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
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
25.11.2013, 09:03
    #38476157
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
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
25.11.2013, 10:06
    #38476223
kar-karich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
ПЕНСИОНЕРКА, да есть там переход на новую запись. просто проца оч большая и однотипная. всю копировать сюда не стал. сам факт вывода первых 200 записей зафиксирован ... в течение 20 минут.
Как я понимаю, сама технология вывода таким образом медленная. Вот и вопрос: есть ли технология быстрее? мож отключить чего нужно кроме визуализации. Ну и загрузка процессора по 50% при передаче обычных текстовых строк ... это ж просто капец! не Война и Мир ж каждой строке. Там больше половины ячеек просто Да или Нет
...
Рейтинг: 0 / 0
25.11.2013, 11:31
    #38476327
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
kar-karichВопрос: есть ли способ выгружать данные в ворд быстрее?
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
...
Рейтинг: 0 / 0
25.11.2013, 12:27
    #38476426
kar_karich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
qwerty112kar-karichВопрос: есть ли способ выгружать данные в ворд быстрее?
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?
...
Рейтинг: 0 / 0
25.11.2013, 12:48
    #38476460
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
kar_karichqwerty112пропущено...

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

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

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

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


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

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

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

я запустила циклом на 500 записей --какие-секунды(таблица локальная)
...
Рейтинг: 0 / 0
25.11.2013, 14:54
    #38476725
Вывод отчёта в ворд средствами vba
kar-karichесть ли способ выгружать данные в ворд быстрее? Есть.
1. Метод InsertDatabase объекта Range. Но ваш запрос с параметром здесь не пройдет. Нужно указывать текст запроса, в котором вместо параметра указывать значение явно.
2. Откыть ADODB.Recordset, его методом GetString получить и вставить в документ текст с разделителями, а затем методом ConvertToTable объекта Range преобразовать в таблицу.
...
Рейтинг: 0 / 0
25.11.2013, 15:05
    #38476758
kar-karich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
qwerty112kar-karichтык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений
"цэтирую"
С.Форт, Т.Хоун, Д.Релстон : Access 2000, Энциклопедия пользователя... код автоматизации быстрее всего выполняется на сервере автоматизации. Другими словами, при автоматизации объектов, свойств и методов Word, код VBA должен быть помещён в шаблоны Word, а не скопирован в Access.
...
Выполнение кода в Word происходит гораздо быстрее, поскольку отпадает необходимость в перекрёстной связи для каждой инструкции автоматизации. Если код находится в Word, код VBA выполняется в рамках одного процесса.
я этим "дядькам" - верю :)
попробую позже. ща уж не до того. спасибо)
...
Рейтинг: 0 / 0
26.11.2013, 06:29
    #38477572
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
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
16.10.2014, 14:58
    #38778716
kar-karich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
метод, обозначенный qwerty112 работает так же медленно. Сделал через вывод результата запроса методом OutputTo. Потом открыл файл и добавил форматирование программно. Скорость вывода увечилась в разы. 10 минут уложились в секунд 30
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
03.02.2019, 16:58
    #39768940
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод отчёта в ворд средствами vba
guest_rusimport17000 строк из рекордсета
не всякий комп откроет таблицу в 250-300 страниц
у меня как-то была такая потребность --выводила псевдо -таблицей(по сути гладкий текст и псевдо-графика

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


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