Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
Пытаюсь выгрузить данные запрса в ворд. Открываю существующий файлик, ляпаю в нём табличку и создавая параграфы в каждой ячейке пишу туда соответствующие данные запроса.
Сам процесс занимает афигительно много времени при количестве записей больше 30-ти. При этом загрузка проца процессом WINWORD.EXE 45-55%. При чём это даже при отключении визуализации выгрузки
Выгружают так:
 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 секунд с форматированием. Выравнивание текста, конешн, идёт не таблицей, а табуляцией, но чёт думаю и таблицей можно выводить быстро или нет?
25 ноя 13, 07:52    [15183275]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4449
kar-karich,

While Not tbl.EOF
      .Cell(1 + k, 2).Range.Text = tbl!fio
    k=k+1
   Wend
25 ноя 13, 08:55    [15183352]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4449
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
25 ноя 13, 09:03    [15183377]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
ПЕНСИОНЕРКА, да есть там переход на новую запись. просто проца оч большая и однотипная. всю копировать сюда не стал. сам факт вывода первых 200 записей зафиксирован ... в течение 20 минут.
Как я понимаю, сама технология вывода таким образом медленная. Вот и вопрос: есть ли технология быстрее? мож отключить чего нужно кроме визуализации. Ну и загрузка процессора по 50% при передаче обычных текстовых строк ... это ж просто капец! не Война и Мир ж каждой строке. Там больше половины ячеек просто Да или Нет
25 ноя 13, 10:06    [15183667]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
qwerty112
Guest
kar-karich
Вопрос: есть ли способ выгружать данные в ворд быстрее?

если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...
25 ноя 13, 11:31    [15184169]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar_karich
Guest
qwerty112
kar-karich
Вопрос: есть ли способ выгружать данные в ворд быстрее?

если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...

ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?
25 ноя 13, 12:27    [15184524]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
qwerty112
Guest
kar_karich
qwerty112
пропущено...

если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...

ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?

имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом
25 ноя 13, 12:48    [15184668]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
qwerty112
kar_karich
пропущено...

ну так а почему стандартный экспорт в ворд пашет в сто раз быстрее, чем через вба?

имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом

тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?
25 ноя 13, 12:57    [15184721]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
qwerty112
Guest
kar-karich
qwerty112
пропущено...

имхо, по той же самой причине (по которой макрос в ворде будет выполняться быстрее, чем тоже из Акс-а)
- "стандартный экспорт в ворд", в процессе экспорта, НЕ выполняет работу со сторонним COM-объектом

тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?

нуу, могу и повторить, мне не жалко
qwerty112
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...

т.е., в Аксе будет что-то типа такого
Set wr = CreateObject("Word.Application")
wr.Run "MyBeautifulMacro", "<путь к БД>" ' 
' wr.Quit ' если не нужно будет выводить полученный файл на экран
Set wr = nothing
25 ноя 13, 13:06    [15184770]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
qwerty112
kar-karich
пропущено...

тогда логичен вопрос: как реализовать создание вордовского файла и закинуть туда данные без работы с сторонним комовским объектом?

нуу, могу и повторить, мне не жалко
qwerty112
если все эти действия оформить в виде процедуры (макроса) в Ворде, а из Акцесса - только вызывать этот макрос, - должно быть быстрее ...

т.е., в Аксе будет что-то типа такого
Set wr = CreateObject("Word.Application")
wr.Run "MyBeautifulMacro", "<путь к БД>" ' 
' wr.Quit ' если не нужно будет выводить полученный файл на экран
Set wr = nothing

тык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений
25 ноя 13, 13:18    [15184883]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
qwerty112
Guest
kar-karich
тык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений

"цэтирую"
С.Форт, Т.Хоун, Д.Релстон : Access 2000, Энциклопедия пользователя
... код автоматизации быстрее всего выполняется на сервере автоматизации. Другими словами, при автоматизации объектов, свойств и методов Word, код VBA должен быть помещён в шаблоны Word, а не скопирован в Access.
...
Выполнение кода в Word происходит гораздо быстрее, поскольку отпадает необходимость в перекрёстной связи для каждой инструкции автоматизации. Если код находится в Word, код VBA выполняется в рамках одного процесса.

я этим "дядькам" - верю :)
25 ноя 13, 13:31    [15185001]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4449
kar-karich,

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


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

я запустила циклом на 500 записей --какие-секунды(таблица локальная)
25 ноя 13, 14:03    [15185276]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
Анатолий ( Киев )
Guest
kar-karich
есть ли способ выгружать данные в ворд быстрее?
Есть.
1. Метод InsertDatabase объекта Range. Но ваш запрос с параметром здесь не пройдет. Нужно указывать текст запроса, в котором вместо параметра указывать значение явно.
2. Откыть ADODB.Recordset, его методом GetString получить и вставить в документ текст с разделителями, а затем методом ConvertToTable объекта Range преобразовать в таблицу.
25 ноя 13, 14:54    [15185775]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
qwerty112
kar-karich
тык какая разница где макрос будет лежать: в аксе или в ворд? в любом ж случае комовский объект будет создаваться. разница то в чём? в обоих случаях ситуация с множеством мелких обращений

"цэтирую"
С.Форт, Т.Хоун, Д.Релстон : Access 2000, Энциклопедия пользователя
... код автоматизации быстрее всего выполняется на сервере автоматизации. Другими словами, при автоматизации объектов, свойств и методов Word, код VBA должен быть помещён в шаблоны Word, а не скопирован в Access.
...
Выполнение кода в Word происходит гораздо быстрее, поскольку отпадает необходимость в перекрёстной связи для каждой инструкции автоматизации. Если код находится в Word, код VBA выполняется в рамках одного процесса.

я этим "дядькам" - верю :)

попробую позже. ща уж не до того. спасибо)
25 ноя 13, 15:05    [15185888]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
guest_rusimport
Guest
kar-karich,

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

' 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
26 ноя 13, 06:29    [15188954]     Ответить | Цитировать Сообщить модератору
 Re: Вывод отчёта в ворд средствами vba  [new]
kar-karich
Guest
метод, обозначенный qwerty112 работает так же медленно. Сделал через вывод результата запроса методом OutputTo. Потом открыл файл и добавил форматирование программно. Скорость вывода увечилась в разы. 10 минут уложились в секунд 30
16 окт 14, 14:58    [16714426]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Вывод отчёта в ворд средствами vba  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4449
guest_rusimport
17000 строк из рекордсета

не всякий комп откроет таблицу в 250-300 страниц
у меня как-то была такая потребность --выводила псевдо -таблицей(по сути гладкий текст и псевдо-графика

этот объем --для EXCEL
3 фев 19, 16:58    [21800823]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить