Слияние почты из Access - Сохранить объединенный документ - PullRequest
2 голосов
/ 30 июля 2010

Я пытаюсь открыть документ из доступа, выполнить слияние по почте, а затем сохранить вывод документа из слияния с использованием VBA.

Вот моя текущая попытка:

Dim templateName as String, tempRoot as String
tempRoot = "C:\report\"
templateName = tempRoot & "template.doc"

Dim objDoc As Word.Document
Dim objWord As New Word.Application
Set objDoc = objWord.Documents.Open(templateName)

objWord.Visible = True   

exportData "AnnualData", tempRoot & "annualData.txt" 'Outputs query to txt file for merge

objDoc.MailMerge.OpenDataSource NAME:= _
    tempRoot & "annualData.txt", ConfirmConversions:=False, ReadOnly _
    :=False, LinkToSource:=True, AddToRecentFiles:=False, PasswordDocument:= _
    "", PasswordTemplate:="", WritePasswordDocument:="", _
    WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
    Connection:="", SQLStatement:="", SQLStatement1:="", SubType:= _
    wdMergeSubTypeOther

objDoc.MailMerge.Execute
objDoc.Close False      'Ideally after closing, the new document becomes the active document?

ActiveDocument.SaveAs tempRoot & "testReport.doc"    'And then save?

Set objWord = Nothing
Set objDoc = Nothing

Я получаю объединенный документ, но не могу его сохранить.Я получаю сообщение об ошибке, в котором говорится, что команда не может быть выполнена, когда не открыт ни один документ.

Если кто-то может предоставить какие-либо предложения, это будет оценено.

Ответы [ 2 ]

1 голос
/ 30 июля 2010

Изменен ActiveDocument на objWord.ActiveDocument. Закончился желаемыми результатами.

Спасибо, Рему.

0 голосов
/ 30 июля 2010

Я только что прошел это. Вот что я делаю, и это хорошо работает. oDocument - это форма слияния, которую пользователь выбирает через открытое диалоговое окно. Файл Excel - это запрос, который я ранее экспортировал и поместил во временную папку пользователя. Я попробовал эту технику с запросами Access и временными таблицами, но обнаружил, что использование Excel было намного более простым.

Команда Sleep взята из импортированной системной функции dll (Public Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long)) и дает Word время для запуска слияния. На самом деле, это может быть все, что вам нужно. Это использует Office 2007.

If Not oDocument Is Nothing Then
                  ' get merge source file
               Set oFSO = New FileSystemObject
               Set oFolder = oFSO.GetSpecialFolder(TemporaryFolder)
               strTempFile = oFolder.Path & "\PTDMergeSource.xls"

                  ' run merge
               With oDocument.MailMerge
                   .MainDocumentType = wdFormLetters
                   .Destination = wdSendToNewDocument
                   .OpenDataSource strTempFile, WdOpenFormat.wdOpenFormatDocument, False, False, False, False, , , , , , , "SELECT * FROM `tblMerge$`", , False, WdMergeSubType.wdMergeSubTypeAccess
                   .Execute True
               End With
               Sleep 2
               oDocument.Close False
           Else
             MsgBox "Action was cancelled, or there was an error opening that document. Please try again, then try opening that document in Word. It may be someone else has locked that document (they are editing it). If the problem persists, email the document to the support contractor."
           End If
...