![]() |
|
#1
|
|||
|
|||
![]() Is there a macro I can use that exports the tracked changes, inserts and deletes, to excel? I have a macro (below) that exports the comments but it does not extract the tracked changes. Code:
Sub CopyCommentsToExcel() 'Create in Word vba Dim xlApp As Object Dim xlWB As Object Dim i As Integer On Error Resume Next Set xlApp = GetObject(, "Excel.Application") If Err Then Set xlApp = CreateObject("Excel.Application") End If On Error GoTo 0 xlApp.Visible = True Set xlWB = xlApp.Workbooks.Add ' create a new workbook With xlWB.Worksheets(1) ' Create Heading HeadingRow = 1 .Cells(HeadingRow, 1).Formula = "ITEM NO." .Cells(HeadingRow, 2).Formula = "PAGE" .Cells(HeadingRow, 3).Formula = "REVIEWER" .Cells(HeadingRow, 4).Formula = "COMMENT" .Cells(HeadingRow, 5).Formula = "DATE" For i = 1 To ActiveDocument.Comments.Count .Cells(i + HeadingRow, 1).Formula = ActiveDocument.Comments(i).Index .Cells(i + HeadingRow, 2).Formula = ActiveDocument.Comments(i).Reference.Information(wdActiveEndAdjustedPageNumber) .Cells(i + HeadingRow, 3).Formula = ActiveDocument.Comments(i).Author .Cells(i + HeadingRow, 4).Formula = ActiveDocument.Comments(i).Range .Cells(i + HeadingRow, 5).Formula = Format(ActiveDocument.Comments(i).Date, "dd/MM/yyyy") .Cells(i + HeadingRow, 6).Formula = ActiveDocument.Comments(i).Range.ListFormat.ListString Next i End With Set xlWB = Nothing Set xlApp = Nothing End Sub Last edited by macropod; 09-12-2018 at 02:27 PM. Reason: Added code tags & formatting |
#2
|
||||
|
||||
![]()
The following Word macro exracts Track-Changes Data for all story ranges in the active document and sends them to a new Excel workbook. Field braces are replaced with ordinary braces and, if the revision is in a table cell, the cell address is reported in the form of '* A1 *'. Changes to Footnote & Endnote separators, continuation separators & continuation notices are ignored.
Code:
Sub ExportRevisions() 'Sourced from: https://www.msofficeforums.com/133132-post2.html 'Note: A VBA Reference to Excel is required, set via Tools|References in the Word VBE Dim wdRng As Range, StrOut As String, StrTmp As String, i As Long, j As Long, SBar As Boolean ' Store current Status Bar status, then switch on SBar = Application.DisplayStatusBar Application.DisplayStatusBar = True ' Turn Off Screen Updating Application.ScreenUpdating = False StrOut = Replace("Folder|Document|Location|Author|Date & Time|Delete|Insert|From|To|Replace|Format|Other", "|", vbTab) With ActiveDocument If .Revisions.Count = 0 Then MsgBox "There are no revisions (tracked changes) in this document. Exiting.", vbOKOnly: Exit Sub 'Get Folder & Filname StrOut = StrOut & vbCr & .Path & vbTab & .Name For Each wdRng In .StoryRanges With wdRng ' Process the Revisions For i = 1 To .Revisions.Count StatusBar = "Analysing Revision " & i ' ***** 'Start a new line StrOut = StrOut & vbCr & vbTab & vbTab With .Revisions(i) 'Get Location, Author & .Date Select Case wdRng.StoryType Case wdEvenPagesFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " EvenPagesFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdFirstPageFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " FirstPageFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdPrimaryFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " PrimaryFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdEvenPagesHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " EvenPagesHeader" & vbTab & .Author & vbTab & .Date & vbTab Case wdFirstPageHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " FirstPageHeader" & vbTab & .Author & vbTab & .Date & vbTab Case wdPrimaryHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " PrimaryHeaderStory" & vbTab & .Author & vbTab & .Date & vbTab Case wdEndnotesStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Endnote: " & .Range.Endnotes(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdFootnotesStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Footnote: " & .Range.Footnotes(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdCommentsStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Comment: " & .Range.Comments(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdEndnoteContinuationNoticeStory, wdEndnoteContinuationSeparatorStory, wdEndnoteSeparatorStory StrOut = StrOut & vbTab & .Author & vbTab & .Date & vbTab Case wdFootnoteContinuationNoticeStory, wdFootnoteContinuationSeparatorStory, wdFootnoteSeparatorStory StrOut = StrOut & vbTab & .Author & vbTab & .Date & vbTab Case wdMainTextStory, wdTextFrameStory StrOut = StrOut & "Page: " & .Range.Characters.First.Information(wdActiveEndAdjustedPageNumber) & vbTab & .Author & vbTab & .Date & vbTab End Select 'Get Revision Type & Scope Select Case .Type Case wdRevisionDelete StrOut = StrOut & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionInsert StrOut = StrOut & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionMovedFrom StrOut = StrOut & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionMovedTo StrOut = StrOut & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionReplace StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionProperty, wdRevisionStyle, wdRevisionParagraphProperty 'Formatting StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case Else StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & vbTab & vbTab & "Other" With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With End Select End With ' ***** Next End With Next End With Dim xlApp As New Excel.Application, xlWkBk As Excel.Workbook With xlApp .Visible = True .DisplayStatusBar = True .ScreenUpdating = False Set xlWkBk = .Workbooks.Add ' Update the workbook. With xlWkBk.Worksheets(1) For i = 0 To UBound(Split(StrOut, vbCr)) xlApp.StatusBar = "Exporting Revision " & i StrTmp = Split(StrOut, vbCr)(i) For j = 0 To UBound(Split(StrTmp, vbTab)) .Cells(i + 1, j + 1).Value = Split(StrTmp, vbTab)(j) Next Next .UsedRange.Replace What:="¶", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.Replace What:="¤", Replacement:=ChrW(&H2192), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.HorizontalAlignment = xlGeneral .UsedRange.VerticalAlignment = xlTop .Columns("A:L").AutoFit For i = 6 To 12 .Columns(i).ColumnWidth = 80 Next .Rows.AutoFit End With .StatusBar = False .DisplayStatusBar = SBar .ScreenUpdating = True ' Tell the user we're done. MsgBox "Workbook updates finished.", vbOKOnly End With ' Release object memory Set xlWkBk = Nothing: Set xlApp = Nothing ' Clear the Status Bar Application.StatusBar = False ' Restore original Status Bar status Application.DisplayStatusBar = SBar ' Restore Screen Updating Application.ScreenUpdating = True End Sub Function TidyText(StrTxt As String) TidyText = Replace(Replace(Replace(Replace(Replace(StrTxt, vbTab, "¤"), vbCr, "¶"), Chr(11), "¶"), Chr(19), "{"), Chr(21), "}") End Function Function ColAddr(i As Long) As String If i > 26 Then ColAddr = Chr(64 + Int(i / 26)) & Chr(64 + (i Mod 26)) Else ColAddr = Chr(64 + i) End If End Function Code:
For Each wdRng In .StoryRanges With wdRng Code:
End With Next Code:
Option Explicit Dim FSO As Object, objFldr As Object, StrFlds As String, StrOut As String Sub GetDocumentRevisions() 'Sourced from: https://www.msofficeforums.com/133132-post2.html 'Note: A VBA Reference to Word is required, via Tools|References in the VBE Dim strTpFldr As String, vFldrs, vFldr, Rslt, i As Long, j As Long, StrTmp As String, xlSht As Worksheet strTpFldr = GetFolder: If strTpFldr = "" Then Exit Sub Rslt = MsgBox("Include Sub-Folders?", vbYesNo) Dim wdApp As New Word.Application: wdApp.Visible = True: wdApp.WordBasic.DisableAutoMacros StrOut = Replace("Folder|Document|Location|Author|Date & Time|Delete|Insert|From|To|Replace|Format|Other", "|", vbTab) If Rslt = vbYes Then StrFlds = vbCr & strTpFldr If FSO Is Nothing Then Set FSO = CreateObject("Scripting.FileSystemObject") Set vFldrs = FSO.GetFolder(strTpFldr).SubFolders For Each vFldr In vFldrs RecurseWriteFolderName (vFldr) Next For i = 1 To UBound(Split(StrFlds, vbCr)) Call ExportRevisions(wdApp, CStr(Split(StrFlds, vbCr)(i))) Next Else Call ExportRevisions(wdApp, strTpFldr) End If wdApp.Quit: Set wdApp = Nothing If SheetExists("Revisions") = True Then Set xlSht = Sheets("Revisions") Else Set xlSht = Sheets.Add xlSht.Name = "Revisions" End If With xlSht .UsedRange.ClearContents For i = 0 To UBound(Split(StrOut, vbCr)) StrTmp = Split(StrOut, vbCr)(i) For j = 0 To UBound(Split(StrTmp, vbTab)) .Cells(i + 1, j + 1).Value = Split(StrTmp, vbTab)(j) Next Next j = UBound(Split(StrOut, vbCr)) + 1 .UsedRange.Replace What:="¶", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.Replace What:="¤", Replacement:=ChrW(&H2192), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.HorizontalAlignment = xlGeneral .UsedRange.VerticalAlignment = xlTop .Columns("A:L").AutoFit For i = 6 To 12 .Columns(i).ColumnWidth = 80 Next .Rows.AutoFit End With Application.StatusBar = False MsgBox "Revisions export complete.", vbOKOnly Application.ScreenUpdating = True End Sub Sub ExportRevisions(wdApp As Word.Application, StrFld As String) Dim strDoc As String, strFls, wdDoc As Word.Document, wdRng As Word.Range, i As Long strDoc = Dir(StrFld & "\*.docx", vbNormal) Do While strDoc <> "" Excel.Application.StatusBar = "Processing: " & StrFld & "\" & strDoc Set wdDoc = wdApp.Documents.Open(Filename:=StrFld & "\" & strDoc, ReadOnly:=True, AddToRecentFiles:=False) With wdDoc 'Get Folder & Filname StrOut = StrOut & vbCr & StrFld & vbTab & strDoc For Each wdRng In .StoryRanges With wdRng For i = 1 To .Revisions.Count If i Mod 100 = 0 Then DoEvents 'Start a new line StrOut = StrOut & vbCr & vbTab & vbTab With .Revisions(i) 'Get Location, Author & .Date Select Case wdRng.StoryType Case wdEvenPagesFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " EvenPagesFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdFirstPageFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " FirstPageFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdPrimaryFooterStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " PrimaryFooter" & vbTab & .Author & vbTab & .Date & vbTab Case wdEvenPagesHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " EvenPagesHeader" & vbTab & .Author & vbTab & .Date & vbTab Case wdFirstPageHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " FirstPageHeader" & vbTab & .Author & vbTab & .Date & vbTab Case wdPrimaryHeaderStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ " PrimaryHeaderStory" & vbTab & .Author & vbTab & .Date & vbTab Case wdEndnotesStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Endnote: " & .Range.Endnotes(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdFootnotesStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Footnote: " & .Range.Footnotes(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdCommentsStory StrOut = StrOut & "Section " & .Range.Sections(1).Index & _ "Comment: " & .Range.Comments(1).Index & vbTab & .Author & vbTab & .Date & vbTab Case wdEndnoteContinuationNoticeStory, wdEndnoteContinuationSeparatorStory, wdEndnoteSeparatorStory StrOut = StrOut & vbTab & .Author & vbTab & .Date & vbTab Case wdFootnoteContinuationNoticeStory, wdFootnoteContinuationSeparatorStory, wdFootnoteSeparatorStory StrOut = StrOut & vbTab & .Author & vbTab & .Date & vbTab Case wdMainTextStory, wdTextFrameStory StrOut = StrOut & "Page: " & .Range.Characters.First.Information(wdActiveEndAdjustedPageNumber) & vbTab & .Author & vbTab & .Date & vbTab End Select 'Get Revision Type & Scope Select Case .Type Case wdRevisionDelete StrOut = StrOut & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionInsert StrOut = StrOut & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionMovedFrom StrOut = StrOut & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionMovedTo StrOut = StrOut & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionReplace StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case wdRevisionProperty, wdRevisionStyle, wdRevisionParagraphProperty 'Formatting StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & vbTab & TidyText(.Range.Text) With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With Case Else StrOut = StrOut & vbTab & vbTab & vbTab & vbTab & vbTab & vbTab & "Other" With .Range If .Information(wdWithInTable) Then StrOut = StrOut & " * in cell " & ColAddr(.Cells(1).ColumnIndex) & .Cells(1).RowIndex & " *" End With End Select End With Next End With Next .Close False End With strDoc = Dir() Loop Set wdRng = Nothing: Set wdDoc = Nothing End Sub Sub RecurseWriteFolderName(vFldr) Dim SubFolders As Variant, SubFolder As Variant Set SubFolders = FSO.GetFolder(vFldr).SubFolders StrFlds = StrFlds & vbCr & CStr(vFldr) On Error Resume Next For Each SubFolder In SubFolders RecurseWriteFolderName (SubFolder) Next End Sub Function GetFolder() As String GetFolder = "" Set objFldr = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0) If (Not objFldr Is Nothing) Then GetFolder = objFldr.Items.Item.Path Set objFldr = Nothing End Function Function SheetExists(SheetName As String) As Boolean SheetExists = False On Error GoTo NoSuchSheet If Len(Sheets(SheetName).Name) > 0 Then SheetExists = True NoSuchSheet: End Function Function TidyText(StrTxt As String) TidyText = Replace(Replace(Replace(Replace(Replace(StrTxt, vbTab, "¤"), vbCr, "¶"), Chr(11), "¶"), Chr(19), "{"), Chr(21), "}") End Function Function ColAddr(i As Long) As String If i > 26 Then ColAddr = Chr(64 + Int(i / 26)) & Chr(64 + (i Mod 26)) Else ColAddr = Chr(64 + i) End If End Function
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
![]()
When I run the macro I get this error and it highlights the red bold code below. Any thoughts on how the fix this?
"Compile error: "User-defined type not defined" Code:
Dim xlApp As New Excel.Application, xlWkBk As Excel.Workbook |
#4
|
||||
|
||||
![]()
Did you read the Note one the second line of the code and do as advised?
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#5
|
|||
|
|||
![]()
Hello, this is a wonderful code. I am new to learning how to do all the VBA tricks and have a few questions.
I also found a code the at extracts the comments as well but the extracting of the paragraph header and title doesn't work. Similar to the first example in this thread. And one for the changes in the images. I would like to have all these functions in one code. The goal is I have multiple users contribution to a master document that goes through an update every year and instead of gathering change suggestions comments in excel, then manually making the changes in word, I'd like for the contributors to make the changes, and provide comments directly in word and then i can pull the author, tracked changes, image changes, comments and there specific location out to a tracker. Then with minor manipulation of the tracker i could have it submitted as a formal document of changes to the revision of the document. Thank you again for any help. |
#6
|
||||
|
||||
![]()
The following Word macro exports comments in the active document to a new Excel workbook. The output includes the Comment: Number, Page; Related Heading # & Heading text (if they exist); Line #, Author; Date & Time; Comment Text; Reference Text; Parent Comment; and whether the comment has been marked as resolved (this feature depends on the document's compatibility status). Where replies to comments have been recorded, ‘Ditto’ is output for the text commented on.
As for: Quote:
Code:
Sub ExportComments() 'Sourced from: https://www.msofficeforums.com/133132-post6.html ' Note: A reference to the Microsoft Excel # Object Library is required, set via Tools|References in the Word VBE. Dim wdDoc As Document, StrCmt As String, StrHd As String, StrTmp As String, i As Long, j As Long StrCmt = "Index,Page,Heading #,Heading,Line,Author,Date & Time,Comment,Reference Text,Parent,Resolved" StrCmt = Replace(StrCmt, ",", vbTab): Set wdDoc = ActiveDocument With wdDoc If .Comments.Count = 0 Then MsgBox "There are no comments in this document. Exiting.", vbOKOnly: Exit Sub End If ' Process the Comments For i = 1 To .Comments.Count With .Comments(i) StrCmt = StrCmt & vbCr & i & vbTab & .Reference.Information(wdActiveEndAdjustedPageNumber) & vbTab StrHd = .Scope.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel").Paragraphs.First.Range.ListFormat.ListString StrCmt = StrCmt & StrHd & vbTab If StrHd <> "" Then StrCmt = StrCmt & Split(.Scope.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel").Paragraphs.First.Range.Text, vbCr)(0) & vbTab Else StrCmt = StrCmt & vbTab End If If .Scope.Information(wdWithInTable) = True Then StrCmt = StrCmt & "Table: " & wdDoc.Range(0, .Scope.Start).Tables.Count & ", Cell: " & ColAddr(.Scope.Cells(1).ColumnIndex) & .Scope.Cells(1).RowIndex Else StrCmt = StrCmt & "Line: " & .Reference.Information(wdFirstCharacterLineNumber) End If StrCmt = StrCmt & vbTab & .Author & vbTab StrCmt = StrCmt & .Date & vbTab & Replace(Replace(.Range.Text, vbTab, " "), vbCr, "") & vbTab If StrTmp <> .Scope.Text Then StrCmt = StrCmt & Replace(Replace(.Scope.Text, vbTab, " "), vbCr, "") & vbTab StrTmp = .Scope.Text Else StrCmt = StrCmt & " Ditto" & vbTab End If If Not .Ancestor Is Nothing Then StrCmt = StrCmt & .Ancestor.Index & vbTab Else StrCmt = StrCmt & vbTab End If StrCmt = StrCmt & .Done & vbTab End With Next End With 'Exit Sub Dim xlApp As New Excel.Application, xlWkBk As Excel.Workbook With xlApp Set xlWkBk = .Workbooks.Add ' Update the workbook. With xlWkBk.Worksheets(1) For i = 0 To UBound(Split(StrCmt, vbCr)) StrTmp = Split(StrCmt, vbCr)(i) For j = 0 To UBound(Split(StrTmp, vbTab)) .Cells(i + 1, j + 1).Value = Split(StrTmp, vbTab)(j) Next Next .UsedRange.Replace What:="¶", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.Replace What:="¤", Replacement:=ChrW(&H2192), LookAt:=xlPart, SearchOrder:=xlByRows .Columns("A:L").AutoFit End With ' Tell the user we're done. MsgBox "Workbook updates finished.", vbOKOnly ' Switch to the Excel workbook .Visible = True End With ' Release object memory Set xlWkBk = Nothing: Set xlApp = Nothing End Sub Function TidyText(StrTxt As String) TidyText = Replace(Replace(Replace(Replace(Replace(StrTxt, vbTab, "¤"), vbCr, "¶"), Chr(11), "¶"), Chr(19), "{"), Chr(21), "}") End Function Function ColAddr(i As Long) As String If i > 26 Then ColAddr = Chr(64 + Int(i / 26)) & Chr(64 + (i Mod 26)) Else ColAddr = Chr(64 + i) End If End Function Code:
Dim FSO As Object, objFldr As Object, StrFlds As String, StrOut As String Sub GetDocumentComments() 'Sourced from: https://www.msofficeforums.com/133132-post6.html Dim strTpFldr As String, vFldrs, vFldr, Rslt, i As Long, j As Long, StrTmp As String, xlSht As Worksheet strTpFldr = GetFolder: If strTpFldr = "" Then Exit Sub Rslt = MsgBox("Include Sub-Folders?", vbYesNo) Dim wdApp As New Word.Application: wdApp.Visible = True: wdApp.WordBasic.DisableAutoMacros StrOut = Replace("Folder|Document|Location|Author|Date & Time|Heading #|Heading|Comment|Reference Text|Marked Resolved", "|", vbTab) If Rslt = vbYes Then StrFlds = vbCr & strTpFldr If FSO Is Nothing Then Set FSO = CreateObject("Scripting.FileSystemObject") Set vFldrs = FSO.GetFolder(strTpFldr).SubFolders For Each vFldr In vFldrs RecurseWriteFolderName (vFldr) Next For i = 1 To UBound(Split(StrFlds, vbCr)) Call ExportComments(wdApp, CStr(Split(StrFlds, vbCr)(i))) Next Else Call ExportComments(wdApp, strTpFldr) End If wdApp.Quit: Set wdApp = Nothing If SheetExists("Comments") = True Then Set xlSht = Sheets("Comments") Else Set xlSht = Sheets.Add xlSht.Name = "Comments" End If With xlSht .UsedRange.ClearContents For i = 0 To UBound(Split(StrOut, vbCr)) StrTmp = Split(StrOut, vbCr)(i) For j = 0 To UBound(Split(StrTmp, vbTab)) .Cells(i + 1, j + 1).Value = Split(StrTmp, vbTab)(j) Next Next j = UBound(Split(StrOut, vbCr)) + 1 .UsedRange.Replace What:="¶", Replacement:=Chr(10), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.Replace What:="¤", Replacement:=ChrW(&H2192), LookAt:=xlPart, SearchOrder:=xlByRows .UsedRange.HorizontalAlignment = xlGeneral .UsedRange.VerticalAlignment = xlTop .Columns("A:J").AutoFit For i = 7 To 9 .Columns(i).ColumnWidth = 80 Next .Rows.AutoFit End With Application.StatusBar = False MsgBox "Comments export complete.", vbOKOnly Application.ScreenUpdating = True End Sub Sub ExportComments(wdApp As Word.Application, StrFld As String) Dim strDoc As String, i As Long, wdDoc As Word.Document, wdRng As Word.Range, StrTxt As String strDoc = Dir(StrFld & "\*.docx", vbNormal) Do While strDoc <> "" Excel.Application.StatusBar = "Processing: " & StrFld & "\" & strDoc Set wdDoc = wdApp.Documents.Open(Filename:=StrFld & "\" & strDoc, ReadOnly:=True, AddToRecentFiles:=False) With wdDoc 'Get Folder & Filname StrOut = StrOut & vbCr & StrFld & vbTab & strDoc For i = 1 To .Comments.Count If i Mod 100 = 0 Then DoEvents 'Start a new line StrOut = StrOut & vbCr & vbTab With .Comments(i) 'Get Location, Author & .Date/Time StrOut = StrOut & vbTab & "Page: " & .Reference.Information(wdActiveEndAdjustedPageNumber) If .Scope.Information(wdWithInTable) = True Then StrOut = StrOut & "¶Table Cell: " & ColAddr(.Scope.Cells(1).ColumnIndex) & .Scope.Cells(1).RowIndex Else StrOut = StrOut & "¶" & "Line: " & .Reference.Information(wdFirstCharacterLineNumber) End If StrOut = StrOut & vbTab & .Author & vbTab & .Date 'Get Related Heading Set wdRng = .Scope.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel").Paragraphs.First.Range If Not wdRng.Style.NameLocal Like "Heading #" Then StrOut = StrOut & vbTab & vbTab Else StrOut = StrOut & vbTab & wdRng.ListFormat.ListString & vbTab & Split(wdRng.Text, vbCr)(0) End If 'Get Comment, Related Text & Status If .Ancestor Is Nothing Then StrOut = StrOut & vbTab & TidyText(.Scope.Text) Else StrOut = StrOut & vbTab & "Reply to: " & .Ancestor.Author End If StrOut = StrOut & vbTab & .Done End With Next .Close False End With strDoc = Dir() Loop Set wdRng = Nothing: Set wdDoc = Nothing End Sub Sub RecurseWriteFolderName(vFldr) Dim SubFolders As Variant, SubFolder As Variant Set SubFolders = FSO.GetFolder(vFldr).SubFolders StrFlds = StrFlds & vbCr & CStr(vFldr) On Error Resume Next For Each SubFolder In SubFolders RecurseWriteFolderName (SubFolder) Next End Sub Function GetFolder() As String GetFolder = "" Set objFldr = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0) If (Not objFldr Is Nothing) Then GetFolder = objFldr.Items.Item.Path Set objFldr = Nothing End Function Function SheetExists(SheetName As String) As Boolean SheetExists = False On Error GoTo NoSuchSheet If Len(Sheets(SheetName).Name) > 0 Then SheetExists = True NoSuchSheet: End Function Function TidyText(StrTxt As String) TidyText = Replace(Replace(Replace(Replace(Replace(StrTxt, vbTab, "¤"), vbCr, "¶"), Chr(11), "¶"), Chr(19), "{"), Chr(21), "}") End Function Function ColAddr(i As Long) As String If i > 26 Then ColAddr = Chr(64 + Int(i / 26)) & Chr(64 + (i Mod 26)) Else ColAddr = Chr(64 + i) End If End Function
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#7
|
||||
|
||||
![]()
Cross-posted at: Exract Tracked Changes from Word to Excel
For cross-posting etiquette, please read: Excelguru Help Site - A message to forum cross posters
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#8
|
|||
|
|||
![]()
How do i select the reference
'Note: A VBA Reference to Excel is required, via Tools|References |
#9
|
||||
|
||||
![]()
The exact library name will vary according the version of Excel you have loaded on your machine. In the VBA editor you need to go to Tools > References and find the library with a name like "Microsoft Excel xx.x Object Library" where xx.x will be a version number.
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
#10
|
|||
|
|||
![]()
The vba in Post #2 from Paul Edstein works like a charm.
Thanks for the assistance. |
#11
|
|||
|
|||
![]()
Works great. Thank You!
|
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Convert specific author's name in comments and tracked changes to another name | rmk911 | Word VBA | 2 | 12-09-2021 09:14 PM |
Tracked changes and comments disappeared with All Markup selected | sleake | Word | 4 | 06-18-2018 05:12 AM |
![]() |
Clint57 | Word | 1 | 08-24-2017 06:56 PM |
Merging certain Tracked Changes and Comments | The_Chefkoch | Word | 0 | 02-01-2017 07:22 AM |
![]() |
andylaw31 | Word | 1 | 08-14-2015 03:13 PM |