Макрос VBA Word не работает должным образом с результатами полей в документе - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть текстовый документ (отчет), и в этом документе я импортирую много текстовых файлов с полями, подобными этим:

{INCLUDETEXT "C:\\PATH\\TOXMLFILES\\Request.xml" \*CHARFORMAT}

Также я обновляю все эти поля макросом при открытиидокумент ...

Sub AutoOpen()
With Options
    .UpdateFieldsAtPrint = True
    .UpdateLinksAtPrint = True
End With
ActiveDocument.Fields.Update
End Sub

Теперь мне нужно выделить текст этих импортированных XML-файлов (в полях IncludeText) между <faultstring></faultstring> тегами

Вот код, который я получил здесьв stackoverflow для выделения текста (выделение жирным шрифтом)

Sub BoldBetweenQuotes()
    ' base for a quotes finding macro
    Dim blnSearchAgain As Boolean
    Dim blnFindStart As Boolean
    Dim blnFindEnd As Boolean
    Dim rngFind As word.Range
    Dim rngFindStart As word.Range
    Dim rngFindEnd As word.Range

    Set rngFind = ActiveDocument.content
    Set rngFindStart = rngFind.Duplicate
    Do
        ' set up find of first of quote pair
        With rngFindStart.Find
            .ClearFormatting
            .Text = "<faultstring>"
            .Replacement.Text = ""
            .Forward = True
            .wrap = wdFindStop
            blnFindStart = .Execute
        End With
        If blnFindStart Then
            rngFindStart.Collapse wdCollapseEnd
            Set rngFindEnd = rngFindStart.Duplicate
            rngFindEnd.Find.Text = "</faultstring>"
            blnFindEnd = rngFindEnd.Find.Execute
            If blnFindEnd Then
                rngFindStart.End = rngFindEnd.Start
                ' make it bold
                rngFindStart.Font.Bold = True
                rngFindStart.Start = rngFindEnd.End
                rngFindStart.End = rngFind.End
                blnSearchAgain = True
            Else
                blnSearchAgain = False
            End If
        Else
            blnSearchAgain = False
        End If
    Loop While blnSearchAgain = True
End Sub

Проблема в том, что когда я запускаю макрос в своем документе Word (с полями IncludeText), он продолжает циклически повторять и выделять жирным шрифтом только первое появление текстамежду тегами faultstring.Когда я запускаю его в новом документе Word с некоторыми случайными текстовыми и ошибочными тегами, он работает хорошо ...

РЕДАКТИРОВАТЬ: Оказывается, проблема в том, что теги faultstring находятся внутри полей IncludeText.Мне нужно превратить поля в статический текст после открытия документа и обновления полей.Как я могу это сделать?

1 Ответ

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

Для преобразования содержимого динамического поля в статический текст с использованием объектной модели Word (например, VBA) требуется метод Fields.Unlink.Для всего документа:

ActiveDocument.Fields.Unlink

Это также возможно для любого заданного Range;удалить поля в последнем абзаце, например:

ActiveDocument.Paragraphs.Last.Range.Fields.Unlink

Чтобы отменить связь только с определенным типом полей, выполните цикл сбора коллекции Fields, протестируйте Field.Type и отсоедините соответственно.Например, для IncludeText:

Sub DeleteIncludeTextFields()
    Dim doc As word.Document

    Set doc = ActiveDocument
    Debug.Print DeleteFieldType(wdFieldIncludeText, doc)
End Sub

Function DeleteFieldType(fldType As word.WdFieldType, doc As word.Document) _
         As Long

    Dim fld As word.Field
    Dim counter As Long

    counter = 0
    For Each fld In doc.Fields
        If fld.Type = wdFieldIncludeText Then
            fld.Unlink
            counter = counter + 1
        End If
    Next

    DeleteFieldType = counter
End Function

Предполагается, что вы хотите сделать это для всех полей в вашем документе после его обновления:

Sub AutoOpen()
  With Options
    .UpdateFieldsAtPrint = True
    .UpdateLinksAtPrint = True
  End With
  ActiveDocument.Fields.Update
  ActiveDocument.Fields.Unlink
End Sub
...