Как переименовать документ Word в соответствии с атрибутом слияния в VBA? - PullRequest
0 голосов
/ 27 марта 2019

Название может быть немного кровавым, но мы здесь.

В настоящее время у меня есть документ Word, который использует объединение писем для вставки двух атрибутов из листа Excel (дата и имя). После того, как объединение сгенерировано, у меня есть макрос, чтобы разделить каждую страницу итогового документа на отдельный документ. Используемый мной макрос просто скопирован и вставлен из VBA Express здесь , см. Ниже.

Sub SplitIntoPages()
    Dim docMultiple As Document
    Dim docSingle As Document
    Dim rngPage As Range
    Dim iCurrentPage As Integer
    Dim iPageCount As Integer
    Dim strNewFileName As String

    Application.ScreenUpdating = False 'Makes the code run faster and reduces screen _
    flicker a bit.
    Set docMultiple = ActiveDocument 'Work on the active document _
    (the one currently containing the Selection)
    Set rngPage = docMultiple.Range 'instantiate the range object
    iCurrentPage = 1
     'get the document's page count
    iPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages)
    Do Until iCurrentPage > iPageCount
        If iCurrentPage = iPageCount Then
            rngPage.End = ActiveDocument.Range.End 'last page (there won't be a next page)
        Else
             'Find the beginning of the next page
             'Must use the Selection object. The Range.Goto method will not work on a page
            Selection.GoTo wdGoToPage, wdGoToAbsolute, iCurrentPage + 1
             'Set the end of the range to the point between the pages
            rngPage.End = Selection.Start
        End If
        rngPage.Copy 'copy the page into the Windows clipboard
        Set docSingle = Documents.Add 'create a new document
        docSingle.Range.Paste 'paste the clipboard contents to the new document
         'remove any manual page break to prevent a second blank
        docSingle.Range.Find.Execute Findtext:="^m", ReplaceWith:=""
         'build a new sequentially-numbered file name based on the original multi-paged file name and path
        strNewFileName = Replace(docMultiple.FullName, ".doc", "_" & Right$("000" & iCurrentPage, 4) & ".doc")
        docSingle.SaveAs strNewFileName 'save the new single-paged document
        iCurrentPage = iCurrentPage + 1 'move to the next page
        docSingle.Close 'close the new document
        rngPage.Collapse wdCollapseEnd 'go to the next page
    Loop 'go to the top of the do loop
    Application.ScreenUpdating = True 'restore the screen updating

     'Destroy the objects.
    Set docMultiple = Nothing
    Set docSingle = Nothing
    Set rngPage = Nothing
End Sub

Однако существует более 90 страниц слияния, и, как видно из приведенного выше кода, все они именуются путем добавления цифр в конец имени файла. Вместо этого я хотел бы иметь его, чтобы он считывал объединенный атрибут Date с каждой страницы и использовал его вместо имени файла. Я попытался поработать с кодом и прочитать об этом в MS Dev Center, но мне не повезло.

Кто-нибудь может помочь? Благодаря.

1 Ответ

1 голос
/ 28 марта 2019

Гораздо лучший подход - создавать отдельные документы с самого начала. Добавив следующий макрос в основной документ mailmerge, вы можете создать один выходной файл для каждой записи. Файлы сохраняются в той же папке, что и основной документ mailmerge, используя поле «Дата» в источнике данных для имен файлов. Выходные форматы PDF и DOCX обслуживаются. Помните, что если в вашем источнике данных есть повторяющиеся даты, выживет только последняя обработанная дата.

Sub Merge_To_Individual_Files()
'Merges one record at a time to the folder containing the mailmerge main document.
' Sourced from: http://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html
Application.ScreenUpdating = False
Dim StrFolder As String, StrName As String, MainDoc As Document, i As Long, j As Long
Set MainDoc = ActiveDocument
With MainDoc
  StrFolder = .Path & Application.PathSeparator
  For i = 1 To .MailMerge.DataSource.RecordCount
    With .MailMerge
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      With .DataSource
        .FirstRecord = i
        .LastRecord = i
        .ActiveRecord = i
        If Trim(.DataFields("Date")) = "" Then Exit For
        StrName = Format(.DataFields("Date"), "YYYY-MM-DD")
      End With
      .Execute Pause:=False
      If Err.Number = 5631 Then
        Err.Clear
        GoTo NextRecord
      End If
    End With
    With ActiveDocument
      .SaveAs FileName:=StrFolder & StrName & ".docx", FileFormat:=wdFormatXMLDocument, AddToRecentFiles:=False
      ' and/or:
      .SaveAs FileName:=StrFolder & StrName & ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
      .Close SaveChanges:=False
    End With
NextRecord:
  Next i
End With
Application.ScreenUpdating = True
End Sub

Примечание 1: Приведенный выше код по умолчанию сохраняет результаты в папку основного документа mailmerge. Вы можете изменить папку назначения, отредактировав:

StrFolder = .Path & Application.PathSeparator

Примечание 2: Если вы переименуете вышеупомянутый макрос в «MailMergeToDoc», нажатие на кнопку «Редактировать отдельные документы» прервет объединение, и процесс запустится автоматически. Потенциальным недостатком перехвата процесса «Редактирование отдельных документов» является то, что вам больше не нужно выбирать, какие записи объединять на этом этапе. Однако вы все равно можете достичь того же результата - и с большим контролем - с помощью инструментов «Редактировать список получателей».

...