View Single Post
 
Old 10-24-2021, 09:10 PM
Guessed's Avatar
Guessed Guessed is offline Windows 10 Office 2016
Expert
 
Join Date: Mar 2010
Location: Canberra/Melbourne Australia
Posts: 3,969
Guessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant futureGuessed has a brilliant future
Default

Roy

If you are doing a search for 'Table #' and the document is correctly created, there will be multiple instances that your macro might find, all of which will needed to be handled/ignored by your code.
Table Captions, when done correctly are composed of two parts. The text "Table " followed by a Seq field with the series name 'Table" such that the field code starts with {Seq Table ...}
Cross references to a table caption are usually a Ref field with the name of a bookmark so the field looks something like {Ref _Ref86060324 \h} where the _Ref# is automatically 'randomly' generated when you use the Insert Cross Reference dialog.
List of Tables is also another instance where you would expect to see lots of Table #'s appear but you most likely will ignore these completely.

The following code is pulling all instances into the workbook. You would probably want to expand on this code to exclude the hits you don't want.
Code:
Sub findRef()
  Dim wdApp As Object, wdDoc As Object, aRng As Object, strFile As String
  Dim aSheet As Worksheet, iRow As Integer
  
  Set aSheet = ThisWorkbook.ActiveSheet
  aSheet.Range("A1:D1") = Split("Doc,Page,Text,FieldCode", ",")
  iRow = 1
  
  With Application.FileDialog(msoFileDialogOpen)
    If .Show = -1 Then
      strFile = .SelectedItems(1)
    End If
  End With
  
  If strFile = "" Then Exit Sub
  
  On Error Resume Next
  Set wdApp = GetObject(, "Word.Application")
  If Err.Number <> 0 Then Set wdApp = CreateObject("Word.Application")
  wdApp.Visible = False
  
  Set wdDoc = wdApp.Documents.Open(Filename:=strFile, AddToRecentFiles:=False, Visible:=False)
  Set aRng = wdDoc.Range
  With aRng.Find
    .ClearFormatting
    .Text = "Table?[0-9]{1,3}"
    .MatchWildcards = True
    .MatchCase = False
    Do While .Execute  ' Loop until Word can no longer find the search string
      iRow = iRow + 1
      aSheet.Range("A" & iRow) = strFile
      aSheet.Range("B" & iRow) = aRng.Information(3)    'wdActiveEndPageNumber = 3
      aSheet.Range("C" & iRow) = aRng.Text
      aRng.MoveStart Unit:=1, Count:=-1                 'wdCharacter = 1
      aRng.MoveEnd Unit:=1, Count:=1
      If aRng.Fields.Count > 0 Then
        aSheet.Range("D" & iRow) = aRng.Fields(1).Code.Text
      Else
        aSheet.Range("D" & iRow) = "No field"
      End If ''
      aRng.Collapse Direction:=0      'wdCollapseEnd
    Loop
  End With
      
  wdDoc.Close False
  
  Set aRng = Nothing
  Set wdDoc = Nothing
  wdApp.Visible = True
  wdApp.Quit
  Set wdApp = Nothing

End Sub
__________________
Andrew Lockton
Chrysalis Design, Melbourne Australia
Reply With Quote