VBA MS Word - вставьте все поля слияния в документ Word сразу - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время MS Word допускает вставку только одного поля слияния за один раз.Я ищу код VBA, который позволил бы мне сразу вставить все поля слияния в документ Word и / или код, который бы вводил поле слияния, в котором имя того же текста слияния появляется в документе.Для второй возможности я нашел следующий код, который позволяет пользователю преобразовывать текст, соответствующий имени слияния, в поле слияния по одному (http://apsona.com/blog/how-to-quickly-create-merge-fields-in-word/).Я имею дело с источником данных, который содержит тысячи полей слияния, поэтому в идеале я бы хотел сделать это для всех сразу или создать цикл или что-то подобное.

Sub MakeMergeField()
Selection.Copy
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
"MERGEFIELD """ + Selection.Text + """, PreserveFormatting:=True"
End Sub

1 Ответ

0 голосов
/ 26 апреля 2018

В Word нет функциональности для одновременной вставки всех полей слияния, поэтому вам необходимо вставлять их по отдельности в цикле.

Это делается следующим образом, разделяя каждое поле слияния пробелом.

(Примечание. Обычно, когда вы вставляете что-то в Word, цель Range включает в себя то, что было вставлено - не так с полями слияния. Поэтому Range.Start перемещается в конец документа после каждой вставки перед добавлениемпробел к нему. Затем Range нужно «свернуть» за пределы этого пробела, прежде чем делать следующую вставку.)

Sub InsertAllMergeFields()
    Dim doc As word.Document
    Dim rng As word.Range
    Dim mm As word.MailMergeDataField

    Set doc = ActiveDocument
    Set rng = doc.content
    If doc.MailMerge.MainDocumentType <> wdNotAMergeDocument Then
        For Each mm In doc.MailMerge.DataSource.DataFields
            doc.MailMerge.Fields.Add rng, mm.NAME
            rng.Start = doc.content.End
            rng.InsertAfter " "
            rng.Collapse wdCollapseEnd
        Next
    End If
End Sub
...