Использование Selection.Find в Microsoft.Office.Interop.Word для поиска отслеженных изменений в документе

В настоящее время я использую приведенный ниже код в приложении VB.Net, чтобы найти конкретный текст в документе Word. Текст окружен символами, представленными кодами символов в выражении. Text. Код ниже работает нормально. Проблема в том, что иногда нужный текст в документе помечается для удаления и отображается как отслеженное изменение в документе. Я хотел бы найти только нужный текст, который НЕ был помечен для удаления. Кто-нибудь знает способ определить, является ли найденный текст удалением?

    xSelection.MoveStart(Word.WdUnits.wdStory)
    xSelection.Find.ClearFormatting()
    xSelection.Find.Replacement.ClearFormatting()
    With xSelection.Find
        .Text = ChrW(65000) & "( \[*)" & ChrW(65001)
        .Replacement.Text = ""
        .Forward = True
        .Wrap = Word.WdFindWrap.wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)

    Do While xSelection.Find.Found
        ........Execute additional code here
    Loop

3 ответа

Попробуйте отключить отображение ревизий перед поиском или обработкой документа Word:

document.ShowRevisions = false;

Он сохраняет отслеживание изменений в документе, если он присутствует, но позволяет вам видеть и справляться только с новейшим контентом, например, без каких-либо удалений и т. Д.

Для меня это работает, чтобы установить окончательный вид ревизии до поиска. Затем будет найден только текст, видимый в окончательной ревизии (вы можете сделать резервную копию предыдущего значения и восстановить представление после завершения поиска):

ActiveDocument.Windows(1).View.RevisionsView = wdRevisionsViewFinal

Полный код:

' set view to show final document revision
' to prevent deleted text from being found
Word.WdRevisionsView revisionsView = xSelection.Document.Windows(1).View.RevisionsView
xSelection.Document.Windows(1).View.RevisionsView = Word.WdRevisionsView.wdRevisionsViewFinal

xSelection.MoveStart(Word.WdUnits.wdStory)
xSelection.Find.ClearFormatting()
xSelection.Find.Replacement.ClearFormatting()
With xSelection.Find
    .Text = ChrW(65000) & "( \[*)" & ChrW(65001)
    .Replacement.Text = ""
    .Forward = True
    .Wrap = Word.WdFindWrap.wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    .MatchWildcards = True
End With
xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)

Do While xSelection.Find.Found
    ........Execute additional code here
Loop

' restore previous view
xSelection.Document.Windows(1).View.RevisionsView = revisionsView 

Я закончил цикл каждой ревизии и изменил цвет шрифта удаленных ревизий, чтобы отличать их от не удаленных комментариев следующим образом:

    For Each xRevision In theDoc.Revisions
        If xRevision.Type = Word.WdRevisionType.wdRevisionDelete Then
            xRevision.Range.Font.Color = Word.WdColor.wdColorBlack
        End If
    Next

Затем я могу выполнить поиск и обработать найденные комментарии по-разному в зависимости от их цвета шрифта:

    xSelection.MoveStart(Word.WdUnits.wdStory)
    xSelection.Find.ClearFormatting()
    xSelection.Find.Replacement.ClearFormatting()
    With xSelection.Find
        .Text = ChrW(65000) & "( \[*)" & ChrW(65001)
        .Replacement.Text = ""
        .Forward = True
        .Wrap = Word.WdFindWrap.wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    xSelection.Find.Execute(Replace:=Word.WdReplace.wdReplaceNone)

    Do While xSelection.Find.Found
        If xSelection.Font.Color = Word.WdColor.wdColorAutomatic Then
            .....
        End If
        xSelection.Find.Execute()
    Loop
Другие вопросы по тегам