Display the final proposed text in Tracked Change without accepting the change

五迷三道 提交于 2021-01-29 16:46:39

问题


I am trying to write a Macro that can display the final proposed text in a tracked change without having to accept the change.

Current code (modified from thedoctools.com) is as follows which uses a Revision object only for Delete and Insert types:

Public Sub ExtractAllRevisionsToExcel()
    Dim oDoc As Document
    Dim xlApp As Excel.Application
    Dim xlWB As Excel.Workbook
    Dim oNewExcel As Worksheet
    Dim oRange As Range
    Dim oRevision As Revision
    Dim strText As String
    Dim index As Long
    Dim Title As String
    
    Title = "Extract All revisions to Excel"
    Set oDoc = ActiveDocument
    
    If ActiveDocument.Revisions.Count = 0 Then
        MsgBox "The active document contains no changes.", vbOKOnly, Title
        GoTo ExitHere
    End If
    
    Application.ScreenUpdating = True
    'Create a new excel for the revisions
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlWB = xlApp.Workbooks.Add 'create a new workbook
    Set oNewExcel = xlWB.Worksheets(1)
    
    With oNewExcel
        .Cells(1, 1).Formula = "Document"
        .Cells(1, 2).Formula = "Page"
        .Cells(1, 3).Formula = "line number"
        .Cells(1, 4).Formula = "Original Statement"
        .Cells(1, 5).Formula = "Statement Proposed"
        
        index = 1
        'Get info from each tracked change (insertion/deletion) from oDoc and insert in table
        For Each oRevision In oDoc.Revisions
            Select Case oRevision.Type
               'Only include insertions and deletions
                Case wdRevisionInsert, wdRevisionDelete
                    'In case of footnote/endnote references (appear as Chr(2)),
                    'insert "[footnote reference]"/"[endnote reference]"
                    With oRevision
                        'Get the changed text
                        strText = .Range.Text
                    
                        Set oRange = .Range
                        Do While InStr(1, oRange.Text, Chr(2)) > 0
                            'Find each Chr(2) in strText and replace by appropriate text
                            i = InStr(1, strText, Chr(2))
                            
                            If oRange.Footnotes.Count = 1 Then
                                strText = Replace(Expression:=strText, _
                                        Find:=Chr(2), Replace:="[footnote reference]", _
                                        Start:=1, Count:=1)
                                'To keep track of replace, adjust oRange to start after i
                                oRange.Start = oRange.Start + i
                        
                            ElseIf oRange.Endnotes.Count = 1 Then
                                strText = Replace(Expression:=strText, _
                                        Find:=Chr(2), Replace:="[endnote reference]", _
                                        Start:=1, Count:=1)
                                'To keep track of replace, adjust oRange to start after i
                                oRange.Start = oRange.Start + i
                            End If
                       Loop
                    End With
                    index = index + 1 'Add 1 to row
                    
                    'Insert data in cells in row
                    'The document name
                    .Cells(index, 1).Formula = oDoc.FullName & vbCr
                    'Page number
                    .Cells(index, 2).Formula = oRevision.Range.Information(wdActiveEndPageNumber)
                    'Line number - start of revision
                    .Cells(index, 3).Formula = oRevision.Range.Information(wdFirstCharacterLineNumber)
                    'Original section text
                    .Cells(index, 4).Formula = oRevision.Range.Paragraphs(1).Range.Text
                    'Proposed changes - THIS IS WHERE I WANT TO SEE THE PREVIEW OF THE FINAL SECTION AFTER CHANGE IS ACCEPTED
                    If oRevision.Type = wdRevisionInsert Then
                        .Cells(index, 5).Formula = strText
                        'Apply automatic color (black on white)
                        .Cells(index, 5).Font.Color = wdColorBlue
                    Else
                        .Cells(index, 5).Formula = strText
                        'Apply red color
                        .Cells(index, 5).Font.Color = wdColorRed
                    End If
            End Select
        Next oRevision
    End With
    
    'Repaginate
    ActiveDocument.Repaginate
    'Toggle nonprinting characters twice
    ActiveWindow.ActivePane.View.ShowAll = Not _
    ActiveWindow.ActivePane.View.ShowAll
    ActiveWindow.ActivePane.View.ShowAll = Not _
    ActiveWindow.ActivePane.View.ShowAll
    Application.ScreenUpdating = True
    Application.ScreenRefresh
    
    oNewExcel.Activate
    MsgBox ActiveDocument.Revisions.Count & " changes found. Finished creating the worksheet.", vbOKOnly, Title
    
ExitHere:
    Set oDoc = Nothing
    Set xlWB = Nothing
    Set xlApp = Nothing
    Set oNewExcel = Nothing
    Set oRange = Nothing
End Sub

The variable strText returns only the portion we are changing in oRevision.Range.Paragraphs(1).Range.Text, however I want a variable that returns the final text in oRevision.Range.Paragraphs(1).Range.Text AFTER the change has already been accepted, but without accepting the change in the actual Word document.

Is there a way to get such a variable as I just want to have a preview of the final section after the change is accepted, without accepting the change.


回答1:


Even Word's macro recorder can give you the code for that:

  With ActiveWindow.View
    .ShowRevisionsAndComments = False
    .RevisionsView = wdRevisionsViewFinal
  End With


来源:https://stackoverflow.com/questions/62551674/display-the-final-proposed-text-in-tracked-change-without-accepting-the-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!