Я использую базу данных для извлечения данных, которые мне нужно представить.Поскольку мне нужно представить данные как в альбомной, так и в портретной ориентации, отчет о доступе не поможет.Поэтому я использую Access VBA, чтобы поместить данные в шаблон слова.Однако, когда я запускаю код над полными данными, я продолжаю сталкиваться с ошибкой автоматизации.Слово приложение перестает существовать.
Я запросил, и я не думаю, что у меня есть какие-либо распространенные ошибки кода, связанные с этой проблемой, так что нет объектов со ссылками на слова и т. Д. Я также заменил все ссылки на словаконстанты типа wdcell со своими целочисленными значениями.Я пробежал код в отладке, и когда я пробежал в отладке, код никогда не дает сбой.Я поставил несколько пауз (функция, которая ждет определенное время и выполняет DoEvents), чтобы посмотреть, помогает ли это
Function MoveMergePaste(wdInputName As String, oWord As Word.Application, oWdocMerged As Word.Document) As Long
Dim oWdocMove As Word.Document
Dim oWdocMoveMerged As Word.Document
Dim rst As Recordset
Dim strSQL As String
On Error GoTo ERR_MoveMergePaste
Pause 1
strSQL = "SELECT T.* FROM tblMovementTemp AS T INNER JOIN tblMovementHeader AS H "
strSQL = strSQL & "ON T.FundId = H.FundId ORDER BY tblPosition"
Set rst = CurrentDb.OpenRecordset(strSQL)
Pause 0.5
Set oWdocMove = oWord.Documents.Open(wdInputName)
Pause 0.5
oWdocMove.Bookmarks("PremiumDataStart").Select
rst.MoveFirst
oWord.Selection.TypeText rst!tblElement
oWord.Selection.MoveRight Unit:=12 '(wdcell)
oWord.Selection.TypeText rst!TotalUnits
rst.MoveNext
While Not rst.EOF
oWord.Selection.MoveRight Unit:=12 '(wdcell)
oWord.Selection.TypeText rst!tblElement
oWord.Selection.MoveRight Unit:=12 '(wdcell)
oWord.Selection.TypeText rst!TotalUnits
rst.MoveNext
Wend
'Start mail merge Claims
'------------------------------------------------
With oWdocMove.MailMerge
.MainDocumentType = 0 'wdFormLetters
.OpenDataSource _
Name:=CurrentProject.FullName, _
AddToRecentFiles:=False, _
LinkToSource:=True, _
Connection:="QUERY mailmerge", _
SQLStatement:="SELECT * FROM [tblMovementHeader] "
.Destination = 0 'wdSendToNewDocument
.Execute Pause:=False
End With
'Copy movement data into merged document
'------------------------------------------------
Set oWdocMoveMerged = oWord.ActiveDocument
oWdocMoveMerged.Select
oWord.Selection.WholeStory
oWord.Selection.Copy
oWdocMerged.Select
oWord.Selection.EndKey Unit:=6 '(wdstory)
oWord.Selection.PasteAndFormat (wdFormatOriginalFormatting)
MoveMergePaste = 0
EXIT_MoveMergePaste:
On Error Resume Next
'Close files
'------------------------------------------------
oWdocMove.Close SaveChanges:=False
oWdocMoveMerged.Close SaveChanges:=False
'Release objects
'------------------------------------------------
Set oWdocMove = Nothing
Set oWdocMoveMerged = Nothing
Set rst = Nothing
Exit Function
ERR_MoveMergePaste:
MoveMergePaste = Err.Number
MsgBox Err.Description
Resume EXIT_MoveMergePaste
End Function
Я передаю строку, которая является путем к шаблону слова, объекту приложения словаи существующий документ с открытым словом.подпрограмма создает набор данных для записи, открывает шаблон слова, находит закладку в шаблоне и затем записывает данные из набора записей в шаблон.После этого он выполняет почтовое слияние по шаблону и копирует данные из вновь созданного объединенного документа в открытый документ.Возвращает 0 в случае успеха.Он закрывает шаблон и объединенный документ и освобождает объекты.
В основном это работает, но слишком часто, чтобы его можно было использовать, я получаю ошибку автоматизации.'-2147023170 (800706be)'.Ошибка обычно возникает из-за того, что слово перестало существовать.Если я нарушу код, строка кода, которая возвращает ошибку, будет
oWdocMove.Bookmarks ("PremiumDataStart"). Выберите
Но строка в порядке, ошибка в том, что слово больше не существует.