Group:  Microsoft Word ยป microsoft.public.word.docmanagement
Thread: Track Changes Macro

Geek News

Track Changes Macro
YOSSARIAN_UK 12/17/2008 9:56:11 AM
Hi.

I am trying keep a log of tracked changes across a tabulated word document.
I found a macro online which extracts the changes and produces a table with
author, time, change, line and page captured.

However, I would like to be able to capture the column that the comment
refers to also. Is this possible?

I have posted the macro below (not my own).

Any help would be appreciated.

-----------------------------------------------------------------------------

Sub exportcomments()
'
' exportcomments Macro
' Macro recorded 16/12/2008 by Mark Rose
'Dim oDoc As Document
Dim oNewDoc As Document
Dim oTable As Table
Dim oRow As Row
Dim oCol As Column
Dim oRange As Range
Dim oRevision As Revision
Dim strText As String
Dim n As Long
Dim i As Long
Dim Title As String

Title = "Extract Tracked Changes to New Document"
n = 0 'use to count extracted changes

Set oDoc = ActiveDocument

If oDoc.Revisions.Count = 0 Then
MsgBox "The active document contains no tracked changes.", vbOKOnly,
Title
GoTo ExitHere
Else
'Stop if user does not click Yes
If MsgBox("Do you want to extract tracked changes to a new
document?" & vbCr & vbCr & _
"NOTE: Only insertions and deletions will be included. " & _
"All other types of changes will be skipped.", _
vbYesNo + vbQuestion, Title) <> vbYes Then
GoTo ExitHere
End If
End If

Application.ScreenUpdating = False
'Create a new document for the tracked changes, base on Normal.dot
Set oNewDoc = Documents.Add
'Set to landscape
oNewDoc.PageSetup.Orientation = wdOrientLandscape
With oNewDoc
'Make sure any content is deleted
.Content = ""
'Set appropriate margins
With .PageSetup
.LeftMargin = CentimetersToPoints(2)
.RightMargin = CentimetersToPoints(2)
.TopMargin = CentimetersToPoints(2.5)
End With
'Insert a 6-column table for the tracked changes and metadata
Set oTable = .Tables.Add _
(Range:=Selection.Range, _
numrows:=1, _
NumColumns:=6)
End With

'Insert info in header - change date format as you wish
oNewDoc.Sections(1).Headers(wdHeaderFooterPrimary).Range.Text = _
"Tracked changes extracted from: " & oDoc.FullName & vbCr & _
"Created by: " & Application.UserName & vbCr & _
"Creation date: " & Format(Date, "MMMM d, yyyy")

'Adjust the Normal style and Header style
With oNewDoc.Styles(wdStyleNormal)
With .Font
.Name = "Arial"
.Size = 9
.Bold = False
End With
With .ParagraphFormat
.LeftIndent = 0
.SpaceAfter = 6
End With
End With

With oNewDoc.Styles(wdStyleHeader)
.Font.Size = 8
.ParagraphFormat.SpaceAfter = 0
End With

'Format the table appropriately
With oTable
.Range.Style = wdStyleNormal
.AllowAutoFit = False
.PreferredWidthType = wdPreferredWidthPercent
.PreferredWidth = 100
For Each oCol In .Columns
oCol.PreferredWidthType = wdPreferredWidthPercent
Next oCol
.Columns(1).PreferredWidth = 5 'Page
.Columns(2).PreferredWidth = 5 'Line
.Columns(3).PreferredWidth = 10 'Type of change
.Columns(4).PreferredWidth = 55 'Inserted/deleted text
.Columns(5).PreferredWidth = 15 'Author
.Columns(6).PreferredWidth = 10 'Revision date
End With

'Insert table headings
With oTable.Rows(1)
.Cells(1).Range.Text = "Page"
.Cells(2).Range.Text = "Line"
.Cells(3).Range.Text = "Type"
.Cells(4).Range.Text = "What has been inserted or deleted"
.Cells(5).Range.Text = "Author"
.Cells(6).Range.Text = "Date"
End With

'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
'Add 1 to counter
n = n + 1
'Add row to table
Set oRow = oTable.Rows.Add

'Insert data in cells in oRow
With oRow
'Page number
.Cells(1).Range.Text = _
oRevision.Range.Information(wdActiveEndPageNumber)

'Line number - start of revision
.Cells(2).Range.Text = _

oRevision.Range.Information(wdFirstCharacterLineNumber)

'Type of revision
If oRevision.Type = wdRevisionInsert Then
.Cells(3).Range.Text = "Inserted"
'Apply automatic color (black on white)
oRow.Range.Font.Color = wdColorAutomatic
Else
.Cells(3).Range.Text = "Deleted"
'Apply red color
oRow.Range.Font.Color = wdColorRed
End If

'The inserted/deleted text
.Cells(4).Range.Text = strText

'The author
.Cells(5).Range.Text = oRevision.Author

'The revision date
.Cells(6).Range.Text = Format(oRevision.Date,
"mm-dd-yyyy")
End With
End Select
Next oRevision

'If no insertions/deletions were found, show message and close oNewDoc
If n = 0 Then
MsgBox "No insertions or deletions were found.", vbOKOnly, Title
oNewDoc.Close savechanges:=wdDoNotSaveChanges
GoTo ExitHere
End If

'Apply bold formatting and heading format to row 1
With oTable.Rows(1)
.Range.Font.Bold = True
.HeadingFormat = True
End With

Application.ScreenUpdating = True
Application.ScreenRefresh

oNewDoc.Activate
MsgBox n & " tracked changed have been extracted. " & _
"Finished creating document.", vbOKOnly, Title

ExitHere:
Set oDoc = Nothing
Set oNewDoc = Nothing
Set oTable = Nothing
Set oRow = Nothing
Set oRange = Nothing

End Sub


Re: Track Changes Macro
"Doug Robbins - Word MVP" <dkr[ at ]REMOVECAPSmvps.org> 12/17/2008 11:03:17 AM
What do you mean by column? Is the text in a table so that it is the table
column that you require? If so, you can use
..Information(wdStartOfRangeColumnNumber) to get the information that you
want.

--
Hope this helps.

Please reply to the newsgroup unless you wish to avail yourself of my
services on a paid consulting basis.

Doug Robbins - Word MVP

"YOSSARIAN_UK" <YOSSARIAN_UK[ at ]discussions.microsoft.com> wrote in message
news:5CF24416-ECF4-436E-BC02-2D5C8E1531D1[ at ]microsoft.com...
[Quoted Text]
> Hi.
>
> I am trying keep a log of tracked changes across a tabulated word
> document.
> I found a macro online which extracts the changes and produces a table
> with
> author, time, change, line and page captured.
>
> However, I would like to be able to capture the column that the comment
> refers to also. Is this possible?
>
> I have posted the macro below (not my own).
>
> Any help would be appreciated.
>
> -----------------------------------------------------------------------------
>
> Sub exportcomments()
> '
> ' exportcomments Macro
> ' Macro recorded 16/12/2008 by Mark Rose
> 'Dim oDoc As Document
> Dim oNewDoc As Document
> Dim oTable As Table
> Dim oRow As Row
> Dim oCol As Column
> Dim oRange As Range
> Dim oRevision As Revision
> Dim strText As String
> Dim n As Long
> Dim i As Long
> Dim Title As String
>
> Title = "Extract Tracked Changes to New Document"
> n = 0 'use to count extracted changes
>
> Set oDoc = ActiveDocument
>
> If oDoc.Revisions.Count = 0 Then
> MsgBox "The active document contains no tracked changes.",
> vbOKOnly,
> Title
> GoTo ExitHere
> Else
> 'Stop if user does not click Yes
> If MsgBox("Do you want to extract tracked changes to a new
> document?" & vbCr & vbCr & _
> "NOTE: Only insertions and deletions will be included. " &
> _
> "All other types of changes will be skipped.", _
> vbYesNo + vbQuestion, Title) <> vbYes Then
> GoTo ExitHere
> End If
> End If
>
> Application.ScreenUpdating = False
> 'Create a new document for the tracked changes, base on Normal.dot
> Set oNewDoc = Documents.Add
> 'Set to landscape
> oNewDoc.PageSetup.Orientation = wdOrientLandscape
> With oNewDoc
> 'Make sure any content is deleted
> .Content = ""
> 'Set appropriate margins
> With .PageSetup
> .LeftMargin = CentimetersToPoints(2)
> .RightMargin = CentimetersToPoints(2)
> .TopMargin = CentimetersToPoints(2.5)
> End With
> 'Insert a 6-column table for the tracked changes and metadata
> Set oTable = .Tables.Add _
> (Range:=Selection.Range, _
> numrows:=1, _
> NumColumns:=6)
> End With
>
> 'Insert info in header - change date format as you wish
> oNewDoc.Sections(1).Headers(wdHeaderFooterPrimary).Range.Text = _
> "Tracked changes extracted from: " & oDoc.FullName & vbCr & _
> "Created by: " & Application.UserName & vbCr & _
> "Creation date: " & Format(Date, "MMMM d, yyyy")
>
> 'Adjust the Normal style and Header style
> With oNewDoc.Styles(wdStyleNormal)
> With .Font
> .Name = "Arial"
> .Size = 9
> .Bold = False
> End With
> With .ParagraphFormat
> .LeftIndent = 0
> .SpaceAfter = 6
> End With
> End With
>
> With oNewDoc.Styles(wdStyleHeader)
> .Font.Size = 8
> .ParagraphFormat.SpaceAfter = 0
> End With
>
> 'Format the table appropriately
> With oTable
> .Range.Style = wdStyleNormal
> .AllowAutoFit = False
> .PreferredWidthType = wdPreferredWidthPercent
> .PreferredWidth = 100
> For Each oCol In .Columns
> oCol.PreferredWidthType = wdPreferredWidthPercent
> Next oCol
> .Columns(1).PreferredWidth = 5 'Page
> .Columns(2).PreferredWidth = 5 'Line
> .Columns(3).PreferredWidth = 10 'Type of change
> .Columns(4).PreferredWidth = 55 'Inserted/deleted text
> .Columns(5).PreferredWidth = 15 'Author
> .Columns(6).PreferredWidth = 10 'Revision date
> End With
>
> 'Insert table headings
> With oTable.Rows(1)
> .Cells(1).Range.Text = "Page"
> .Cells(2).Range.Text = "Line"
> .Cells(3).Range.Text = "Type"
> .Cells(4).Range.Text = "What has been inserted or deleted"
> .Cells(5).Range.Text = "Author"
> .Cells(6).Range.Text = "Date"
> End With
>
> '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
> 'Add 1 to counter
> n = n + 1
> 'Add row to table
> Set oRow = oTable.Rows.Add
>
> 'Insert data in cells in oRow
> With oRow
> 'Page number
> .Cells(1).Range.Text = _
> oRevision.Range.Information(wdActiveEndPageNumber)
>
> 'Line number - start of revision
> .Cells(2).Range.Text = _
>
> oRevision.Range.Information(wdFirstCharacterLineNumber)
>
> 'Type of revision
> If oRevision.Type = wdRevisionInsert Then
> .Cells(3).Range.Text = "Inserted"
> 'Apply automatic color (black on white)
> oRow.Range.Font.Color = wdColorAutomatic
> Else
> .Cells(3).Range.Text = "Deleted"
> 'Apply red color
> oRow.Range.Font.Color = wdColorRed
> End If
>
> 'The inserted/deleted text
> .Cells(4).Range.Text = strText
>
> 'The author
> .Cells(5).Range.Text = oRevision.Author
>
> 'The revision date
> .Cells(6).Range.Text = Format(oRevision.Date,
> "mm-dd-yyyy")
> End With
> End Select
> Next oRevision
>
> 'If no insertions/deletions were found, show message and close oNewDoc
> If n = 0 Then
> MsgBox "No insertions or deletions were found.", vbOKOnly, Title
> oNewDoc.Close savechanges:=wdDoNotSaveChanges
> GoTo ExitHere
> End If
>
> 'Apply bold formatting and heading format to row 1
> With oTable.Rows(1)
> .Range.Font.Bold = True
> .HeadingFormat = True
> End With
>
> Application.ScreenUpdating = True
> Application.ScreenRefresh
>
> oNewDoc.Activate
> MsgBox n & " tracked changed have been extracted. " & _
> "Finished creating document.", vbOKOnly, Title
>
> ExitHere:
> Set oDoc = Nothing
> Set oNewDoc = Nothing
> Set oTable = Nothing
> Set oRow = Nothing
> Set oRange = Nothing
>
> End Sub
>
>


Home | Search | Terms | Imprint Contact
Newsgroups Reader - provided by WiredBox.Net