Почему мои имена MergeField являются единственными данными, которые передаются в PDF через MailMerge в Excel? - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я пытаюсь использовать приведенный ниже код в VBA для переноса данных из таблицы в документ WordMerge Word, который затем сохраняет отдельные слияния в формате PDF.Код почти делает это, но когда я запускаю макрос на своем листе Excel, сохраненные PDF-файлы приносят только имена полей слияния из документа word, а не сами данные.

Есть идеи, куда я могу пойти отсюда?В настоящее время я использую Office 2016.

Sub RunMailMerge()

    Dim objWord
    Dim objDoc
    Dim StrFolder As String, StrName As String, i As Long, j As Long

    Dim strWorkbookName As String: strWorkbookName = ThisWorkbook.FullName
    Const StrNoChr As String = """*./\:?|": StrName = "Easy.docx"
    StrFolder = ThisWorkbook.Path & Application.PathSeparator

    If Dir(StrFolder & strDocNm) = "" Then Exit Sub

    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add

    With objWord

        'Disable alerts to prevent an SQL prompt
        .DisplayAlerts = wdAlertsNone
        'Display Word - change this to False once the code is running correctly
        .Visible = False
        'Open the mailmerge main document - set Visible:=True for testing
        Set objWord = .Documents.Open(Filename:=StrFolder & StrName, ReadOnly:=True,
        AddToRecentFiles:=False, Visible:=False)

        With objWord
            With .MailMerge

                'Define the mailmerge type
                .MainDocumentType = wdFormLetters
                'Define the output
                .Destination = wdSendToNewDocument
                .SuppressBlankLines = False
                'Connect to the data source
                .OpenDataSource Name:=strWorkbookName, _
                                ReadOnly:=True, _
                                LinkToSource:=False, _
                                AddToRecentFiles:=False, _
                                Format:=wdOpenFormatAuto, _
                                Connection:="User ID=Admin;DataSource=strWorkbookName;" & _
                                             "Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
                                SQLStatement:="SELECT * FROM `Sheet1                                SQLStatement:=", _
                                SubType:=wdMergeSubTypeAccess
                'Process all eligible records

                For i = 1 To .DataSource.RecordCount

                    With .DataSource
                        .FirstRecord = i
                        .LastRecord = i
                        .ActiveRecord = i
                        'Exit if the field to be used for the filename is empty
                        If Trim(.DataFields("Tenant")) = "" Then Exit For
                        'StrFolder = .DataFields("Folder") & Application.PathSeparator
                        StrName = .DataFields("Tenant")
                    End With

                    .Execute Pause:=True
                    'Clean up the filename

                    For j = 1 To Len(StrNoChr)
                        StrName = Replace(StrName, Mid(StrNoChr, j, 1), "_")
                    Next

                    StrName = "Letter - " & Trim(StrName)
                    'Save as a PDF
                    objWord.SaveAs Filename:=StrFolder & StrName & ".pdf", _
                                   FileFormat:=wdFormatPDF, AddToRecentFiles:=False
                Next i

                'Disconnect from the data source
                .MainDocumentType = wdNotAMergeDocument
            End With

            'Close the mailmerge main document
            .Close False
        End With

        Call CloseAll
        Set wdDoc = Nothing: Set wdApp = Nothing
    End With

End Sub

Sub CloseAll()

    Dim objWord
    Dim objDoc
    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add

    objWord.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges

End Sub

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Этот код по сути является копией кода, который я выложил в другом месте (например, https://www.mrexcel.com/forum/general-excel-discussion-other-questions/713478-word-2007-2010-mail-merge-save-individual-pdf-files-post4796480.html#post4796480),, но почему вы добавляете свой вызов в CloseAll, остается загадкой.

Тем не менее, вам также ясно,также частично изменил код для использования с поздним связыванием, заменив:

Dim wdApp As New Word.Application, wdDoc As Word.Document

на:

Dim objWord
Dim objDoc
...
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add

Если бы вы застряли с ранним связыванием во всем, код работал бы.однако теперь в вашем измененном коде используется сочетание позднего связывания с именованными константами Word, которые действительно применимы только к раннему связыванию. Необходимо полностью адаптировать код для позднего связывания или вернуться к коду, который является полностью ранним связыванием.

0 голосов
/ 27 сентября 2018

Почему вы пытаетесь управлять слиянием почты с помощью кода VBA?Вы должны быть в состоянии A) настроить данные в Excel или Access, B) настроить шаблон в Word и подключить его к источнику данных, C) запустить слияние по почте.Если вы не делаете что-то действительно, действительно причудливое, VBA не должна быть нужна.

Так как кажется, что какой-то садист заставил вас делать трудные вещи, похоже, что ваша ошибка, скорее всего, здесь:

Connection:="User ID=Admin;DataSource=strWorkbookName;" & _
            "Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
            SQLStatement:="SELECT * FROM `Sheet1
            SQLStatement:=", _
            SubType:=wdMergeSubTypeAccess

Прежде всего:

Connection:="User ID=Admin;DataSource=strWorkbookName;" & _

должно быть

Connection:="User ID=Admin;DataSource=" & strWorkbookName & ";" & _

Во-вторых, ваш параметр SQLStatement не определен, и я уверен, что"Sheet1" (не уверен, почему у вас есть дополнительный обратный удар), это не способ ссылаться на «таблицу» (т. Е. Рабочий лист) при выборе из книги Excel.IIRC, это должно быть "WorkBook$WorkSheet", так что это:

            SQLStatement:="SELECT * FROM `Sheet1

должно быть что-то вроде:

            SQLStatement:="SELECT * FROM " & strWorkbookName & "$Sheet1", _

За этой строкой следует конец строки

            SQLStatement:=", _

который был частью фактической строки SQL, отправляемой ядру базы данных в Excel.Это не сработает.

То, как я это читаю, должно выглядеть следующим образом:

Connection:="User ID=Admin;DataSource=" & strWorkbookName & ";" & _
            "Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
            SQLStatement:="SELECT * FROM " & strWorkbookName & "$Sheet1", _
            SubType:=wdMergeSubTypeAccess

Возможно, вам придется немного подправить, но я думаю, что это поможет вамна правильном пути.

...