【问题标题】:Using word wildcards to find unaccepted changes使用单词通配符查找未接受的更改
【发布时间】:2016-09-19 10:15:53
【问题描述】:

我有一些 Word 文档,其中包含未接受的跟踪更改。我想接受它们,但它们在我的文档中仍然显示为红色。我认为这样做的一个好方法是对未接受的更改进行通配符搜索,并将它们替换为相同的红色文本,但是我不知道这是否可能。 我也很高兴通过其他方式实现我的目标,无需通配符。

【问题讨论】:

    标签: vba ms-word wildcard


    【解决方案1】:

    无法使用 Word 的标准查找和替换操作对修订应用格式。但是,您可以编写一个宏来枚举所有修订,然后将格式应用于每个修订。

    Chris Rae 发表了一篇文章,他提供了一个将修订转换为标准格式的宏:

    Enumerating edits on large documents (AKA converting tracked changes to conventional formatting)

    该宏可能还不能完全满足您的需求,但它应该可以帮助您入门。

    作为参考,这里是宏的副本:

    Sub EnumerateChanges()
        Dim rAll As Revision
        Dim dReport As Document
        Dim dBigDoc As Document
    
        Set dBigDoc = ActiveDocument
    
        If dBigDoc.Revisions.Count = 0 Then
            MsgBox "There are no revisions in the active document.", vbCritical
        ElseIf MsgBox(“This will enumerate the changes in '" + dBigDoc.Name + "' in a new document and close the original WITHOUT saving changes. Continue?", vbYesNo) <> vbNo Then
            Set dReport = Documents.Add
    
            dBigDoc.Activate ' really just so we can show progress by selecting the revisions
            dBigDoc.TrackRevisions = False ' Leaving this on results in a disaster
    
            For Each rAll In dBigDoc.Revisions
                ' Now find the nearest section heading downwards
                Dim rFindFirst As Range, rFindLast As Range
                Set rFindLast = rAll.Range.Paragraphs(1).Range
                While Not IsNumberedPara(rFindLast.Next(wdParagraph))
                    Set rFindLast = rFindLast.Next(wdParagraph)
                Wend
                ' Now head back up to the next numbered section header
                Set rFindFirst = rFindLast
                Do
                    Set rFindFirst = rFindFirst.Previous(wdParagraph)
                Loop Until IsNumberedPara(rFindFirst) Or (rFindFirst.Previous(wdParagraph) Is Nothing)
                ConvertNumberedToText rFindFirst
    
                Dim rChangedSection As Range
                Set rChangedSection = dBigDoc.Range(rFindFirst.Start, rFindLast.End)
                ' Properly tag all the revisions in this whole section
                Dim rOnesInThisSection As Revision
                For Each rOnesInThisSection In rChangedSection.Revisions
                    rOnesInThisSection.Range.Select ' just for visual update
                    DoEvents ' update the screen so we can see how far we are through
                    If rOnesInThisSection.Type = wdRevisionDelete Then
                        rOnesInThisSection.Reject
                        With Selection.Range
                            .Font.ColorIndex = wdRed
                            .Font.StrikeThrough = True
                        End With
                        dBigDoc.Comments.Add Selection.Range, “deleted”
                    Else
                        If rOnesInThisSection.Type = wdRevisionInsert Then
                            rOnesInThisSection.Accept
                            With Selection.Range
                                .Font.ColorIndex = wdBlue
                            End With
                            dBigDoc.Comments.Add Selection.Range, “inserted”
                        End If
                    End If
                Next
    
                ' Now copy the whole thing into our new document
                rChangedSection.Copy
                Dim rOut As Range
                Set rOut = dReport.Range
                rOut.EndOf wdStory, False
                rOut.Paste
            Next rAll
    
            ' There should end up being no numbered paragraphs at all in the 
            ' new doc (they were converted to text), so delete them
            Dim pFinal As Paragraph
            For Each pFinal In dReport.Paragraphs
                If IsNumberedPara(pFinal.Range) Then
                    pFinal.Range.ListFormat.RemoveNumbers
                End If
            Next
    
            dBigDoc.Close False
        End If
    End Sub
    
    Sub ConvertNumberedToText(rOf As Range)
        If InStr(rOf.ListFormat.ListString, “.”) > 0 Then
            rOf.InsertBefore "Changes to section " + rOf.ListFormat.ListString + " "
        End If
    End Sub
    
    Function IsNumberedPara(rOf As Range) As Boolean
        If rOf Is Nothing Then ‘ if the document doesn’t have numbered sections, this will cause changes to be enumerated in the whole thing
            IsNumberedPara = True
        ElseIf rOf.ListFormat.ListString <> "" Then
            If Asc(rOf.ListFormat.ListString) <> 63 Then
                IsNumberedPara = True
            End If
        End If
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2020-11-29
      • 2017-05-25
      相关资源
      最近更新 更多