Возможно ли отправить по почте отдельные записи вместо того, чтобы иметь все записи в одном документе? - PullRequest
1 голос
/ 13 марта 2020

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

Однако выдается только сообщение об ошибке «Переменная объекта или переменная блока не установлена». Я подозреваю, что записи, сделанные с помощью оператора SQL, собирают все существующие записи в базе данных.

Можно ли каким-то образом только объединить почту и сохранить как отдельные документы для каждой записи?

Пример:

  1. Записи Записи 1 = Record1.docx
  2. Записи Записи 2 = Record2.docx
  3. Записи Записи 3 = Запись3. docx
Sub startMergeAL()
   Dim oWord As Object, oWdoc As Object
   Dim wdInputName As String, wdOutputName As String, outFileName As String

   'Temporary variables
   Dim totalRecord As Long, recordNumber As Long

   '------------------------------------------------
   ' Set Template Path
   '------------------------------------------------
   wdInputName = CurrentProject.Path & "\Acceptance form V3.docx"

   '------------------------------------------------
   ' Create unique save filename with minutes
   ' and seconds to prevent overwrite
   '------------------------------------------------
   outFileName = "Acceptance Letter - " & Format(Now(), "yyyymmddmms")

   '------------------------------------------------
   ' Output File Path w/outFileName
   '------------------------------------------------
   wdOutputName = CurrentProject.Path & "\Results\" & outFileName

   Set oWord = CreateObject("Word.Application")
   Set oWdoc = oWord.Documents.Open(wdInputName)

   '------------------------------------------------
   ' Start mail merge
   '------------------------------------------------
   With oWdoc.MailMerge
       .MainDocumentType = 0 'wdFormLetters
       .OpenDataSource _
        Name:=CurrentProject.FullName, _
        AddToRecentFiles:=False, _
        LinkToSource:=True, _
        Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=CurrentProject.FullName;" _
        , SQLStatement:="SELECT * FROM `Acceptance_Letter`"
            .Destination = 0 'wdSendToNewDocument
            .Execute Pause:=False
    End With

    '------------------------------------------------
    ' Hide Word During Merge
    '------------------------------------------------
            oWord.Visible = False

            totalRecord = DCount("*", "Acceptance_Letter")
            Debug.Print ("totalRecord: " & totalRecord)


           ''Error
            For recordNumber = 1 To totalRecord

               Debug.Print ("Print: " & recordNumber)
               outFileName = "Acceptance Letter - " & recordNumber

               '------------------------------------------------
               ' Save file as Word Document
               '------------------------------------------------
               oWord.ActiveDocument.SaveAs2 wdOutputName & recordNumber & ".docx"

               '------------------------------------------------        
               ' Quit Word to Save Memory
               '------------------------------------------------
               oWord.Quit savechanges:=False

               '------------------------------------------------
               ' Clean up memory
               '------------------------------------------------
               Set oWord = Nothing
               Set oWdoc = Nothing

            Next recordNumber
    End Sub

1 Ответ

1 голос
/ 14 марта 2020

Не используйте апострофы для разделения имени таблицы в операторе SQL, используйте [ ]. Сбой кода, если он не используется в операторе, назначенном свойству SQLStatement.

Выход из Word и очистка памяти внутри l oop, вероятно, являются причиной ошибки. Однако я сомневаюсь, что l oop может сохранить каждую запись в отдельный файл do c. Для этого может потребоваться циклическое выполнение кода набора записей с полями, которые будут использоваться в качестве критериев для построения отфильтрованного SQL для объединения отдельной записи, сохранения Word do c, закрытия документов Word, перехода к следующей записи, повторного слияния. Рассмотрим:

Sub startMergeAL()
Dim oWord As Object, oWdoc As Object, rs As DAO.Recordset
Set oWord = CreateObject("Word.Application")
Set rs = CurrentDb.OpenRecordset("SELECT ID FROM Acceptance_Letter")
' Hide Word During Merge
oWord.Visible = False
Do While Not rs.EOF
    Set oWdoc = oWord.Documents.Open(CurrentProject.Path & "\Acceptance form V3.docx")
    ' Start mail merge
    With oWdoc.MailMerge
        .MainDocumentType = 0 'wdFormLetters
        .OpenDataSource _
            Name:=CurrentProject.FullName, _
            LinkToSource:=True, _
            AddToRecentFiles:=False, _
            SQLStatement:="SELECT * FROM [Acceptance_Letter] WHERE ID = " & rs!ID, _
            Connection:= _
                 "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;" & _
                 "Data Source=CurrentProject.FullName;"
        .Destination = 0 'wdSendToNewDocument
        .Execute Pause:=False
    End With
    ' Save file as new Word Document
    oWord.ActiveDocument.SaveAs2 CurrentProject.Path & "\Results\Acceptance Letter - " & _
                   Format(Now(), "yyyymmddmms") & "_" & rs!ID & ".docx"
    oWord.ActiveDocument.Close False
    oWdoc.Close False
    rs.MoveNext
Loop
' Quit Word
oWord.Quit savechanges:=False
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...