PDF-файлы, созданные с помощью макроса слияния Excel Mail, не изменяют поля слияния - PullRequest
0 голосов
/ 15 мая 2018

Я скопировал макрос (кредиты: MailMerge Excel в Word отдельные файлы ) в Excel, где я могу автоматически объединять данные из Excel в Word Letter и сохранять отдельные файлы в формате PDF в папке.

К сожалению, мои PDF-файлы не содержат содержимого списка Excel после использования макроса, но придерживаются имени поля слияния.Это относится ко всем моим созданным файлам.

Кроме того, я хотел бы использовать первую строку в качестве контроллера, чтобы я мог решить, какая строка объединяется (например, с "x" в первой строке).

Может ли кто-нибудь помочь мне в обоих случаях?Особенно моя первая проблема - маленькая ошибка, но после нескольких часов поиска я сдался ..: - (

Спасибо за вашу помощь.

 Sub RunMailMerge()

 Dim wdOutputName, wdInputName, PDFFileName As String
 Dim x As Integer
 Dim nRows As Integer

wdInputName = ThisWorkbook.Path & "\Letter.docx"
Const wdFormLetters = 0, wdOpenFormatAuto = 0
Const wdSendToNewDocument = 0, wdDefaultFirstRecord = 1, wdDefaultLastRecord = 3

'This will get you the number of records "-1" accounts for header
nRows = Sheets("Overview").Range("B" & Rows.Count).End(xlUp).Row - 1

' open the mail merge layout file
Dim wdDoc As Object

Set wdDoc = GetObject(wdInputName, "Word.document")

wdDoc.Application.Visible = False


With wdDoc.MailMerge
     .MainDocumentType = wdFormLetters
     .Destination = wdSendToNewDocument
     .SuppressBlankLines = True
      With .DataSource
        .FirstRecord = wdDefaultFirstRecord
        .LastRecord = wdDefaultLastRecord
    End With
     .Execute Pause:=False
End With

For x = 1 To nRows
  With wdDoc.MailMerge.DataSource
     .ActiveRecord = x
     If .ActiveRecord > .LastRecord Then Exit For
  End With

' show and save output file

'cells(x+1,2)references the first cells starting in row 2 and increasing by 1 row with each loop
PDFFileName = ThisWorkbook.Path & "\Letter - " & Sheets("Overview").Cells(x + 1, 2) & ".pdf"

wdDoc.Application.Visible = False
wdDoc.ExportAsFixedFormat PDFFileName, 17   ' This line saves a .pdf-version of the mail merge

Next x

' cleanup
wdDoc.Close SaveChanges:=False
Set wdDoc = Nothing

MsgBox "Your pdf('s) has now been saved!"

End Sub

1 Ответ

0 голосов
/ 16 мая 2018

Добавив следующий макрос в вашу книгу, вы можете создать один выходной файл PDF для каждой записи mailmerge.

Sub RunMailMerge()
'Note: A VBA Reference to the Word Object Model is required, via Tools|References
Dim wdApp As New Word.Application, wdDoc As Word.Document
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 = "Letter.docx"
StrFolder = ThisWorkbook.Path & Application.PathSeparator
If Dir(StrFolder & strDocNm) = "" Then Exit Sub
With wdApp
  'Disable alerts to prevent an SQL prompt
  .DisplayAlerts = wdAlertsNone
  'Display Word - change this to False once the code is running correctly
  .Visible = True
  'Open the mailmerge main document - set Visible:=True for testing
  Set wdDoc = .Documents.Open(Filename:=StrFolder & StrName, ReadOnly:=True, AddToRecentFiles:=False, Visible:=False)
  With wdDoc
    With .MailMerge
      'Define the mailmerge type
      .MainDocumentType = wdFormLetters
      'Define the output
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      'Connect to the data source
      .OpenDataSource Name:=strWorkbookName, ReadOnly:=True, _
        LinkToSource:=False, AddToRecentFiles:=False, _
        Format:=wdOpenFormatAuto, _
        Connection:="Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "User ID=Admin;Data Source=strWorkbookName;" & _
        "Mode=Read;Extended Properties=""HDR=YES;IMEX=1"";", _
        SQLStatement:="SELECT * FROM `Overview$`  WHERE `Filter` = 'x'", _
        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("Name")) = "" Then Exit For
            'StrFolder = .DataFields("Folder") & Application.PathSeparator
            StrName = .DataFields("Name")
          End With
        .Execute Pause:=False
        '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
        wdApp.ActiveDocument.SaveAs Filename:=StrFolder & StrName & ".pdf", _
          FileFormat:=wdFormatPDF, AddToRecentFiles:=False
        wdApp.ActiveDocument.Close SaveChanges:=False
      Next i
      'Disconnect from the data source
      .MainDocumentType = wdNotAMergeDocument
    End With
    'Close the mailmerge main document
    .Close False
  End With
  'Restore the Word alerts
  .DisplayAlerts = wdAlertsAll
  'Exit Word
  .Quit
End With
Set wdDoc = Nothing: Set wdApp = Nothing
End Sub

В кодированном виде файлы сохраняются в той же папке, что и основной документ mailmerge, используя то, что предполагается в качестве поля «Имя» в источнике данных для имен файлов (измените его, чтобы оно соответствовало вашему фактическому имени поля).

Недопустимые символы имени файла (т.е. "*. / :? |) заменяются подчеркиванием.

Непонятно, что вы подразумеваете под " Я хотел бы использовать первую строку в качестве контроллера, чтобы я мог решить, какая строка объединена ". Тем не менее, если вы ссылаетесь на столбец с записями 'x', вы можете использовать фильтр mailmerge, чтобы включить или исключить эти записи. Макрос предполагает, что поле, по которому вы фильтруете, называется «Фильтр», и вы хотите обработать эти записи со строчными буквами «х». Измените детали в строке SQLStatement для соответствия.

Обратите внимание на комментарии о добавлении ссылки на библиотеку Word и ее видимости в коде.

...