Retrieve the index number of specific tables and display them in a msgbox

Dear Experts:

Below macro searches for the string 'Single Products' in the active Document. If this string is located in a table, the macro will come up with a msgbox telling the user that the string has been found.

Could somebody please tweak this macro so that all the index numbers of the tables where the string has been found are listed in a msgbox, e.g.
"The string 'Single Products' has been found in tables (1), (3), (5)."

Help is much appreciated. Thank you very much in advance for your valuable help.

Regards, Andreas


Sub Search_Table()
Dim ht As Single
Dim strLen As Integer
Dim rng As Range
Dim strFind As String

'The index number of the tables that have the string 'Single Products' have to be listed in a MsgBox at the End


    strFind = "Single Products"
    strLen = Len(strFind)

    Set rng = ActiveDocument.Range
     

    With rng
        .Find.ClearFormatting
        With .Find
            .Text = strFind
            .Execute
        End With
        
Do
            If .Find.Found Then
                If rng.Information(wdWithInTable) Then
                MsgBox "String has been found"
                End If
            End If
            
           If Not .Find.Found Then
                MsgBox "String has not been found"
                End If
            rng.MoveStart strLen
            .Find.Execute
        Loop Until Not (.Find.Found)
 End With
    
    

End Sub

Open in new window

Andreas HermleTeam leaderAsked:
Who is Participating?
 
GrahamSkanConnect With a Mentor RetiredCommented:
Hi Andreas,
The table object doesn't have an index property, so it would be best to search each table, keeping track of its index as we go along.
Sub Search_Tables()
    Dim tbl As Table
    Dim strFind As String
    Dim ixTables() As Integer
    Dim ix As Integer
    Dim t As Integer
    Dim strMessage As String
    
    'The index number of the tables that have the string 'Single Products' have to be listed in a MsgBox at the End
    strFind = "Single Products"
    
    For Each tbl In ActiveDocument.Tables
        t = t + 1
        If tbl.Range.Find.Execute(strFind) Then
            ReDim ixTables(ix)
            ixTables(ix) = t
            ix = ix + 1
        End If
    Next tbl
    
    If ix > 0 Then
        strMessage = "String has been found in table" & IIf(ix = 1, "", "s") & ": "
        For t = 0 To ix - 2
            strMessage = strMessage & "(" & ixTables(t) & "), "
        Next t
        strMessage = strMessage & "(" & ixTables(t) & ")."
    Else
         strMessage = "String has not been found"
    End If
        
    MsgBox strMessage

End Sub

Open in new window

0
 
Rgonzo1971Connect With a Mentor Commented:
Hi,

Corrected code: Redim Preserve at line 15
Sub Search_Tables()
    Dim tbl As Table
    Dim strFind As String
    Dim ixTables() As Integer
    Dim ix As Integer
    Dim t As Integer
    Dim strMessage As String
    
    'The index number of the tables that have the string 'Single Products' have to be listed in a MsgBox at the End
    strFind = "Single Products"
    
    For Each tbl In ActiveDocument.Tables
        t = t + 1
        If tbl.Range.Find.Execute(strFind) Then
            ReDim Preserve ixTables(ix)
            ixTables(ix) = t
            ix = ix + 1
        End If
    Next tbl
    
    If ix > 0 Then
        strMessage = "String has been found in table" & IIf(ix = 1, "", "s") & ": "
        For t = 0 To ix - 2
            strMessage = strMessage & "(" & ixTables(t) & "), "
        Next t
        strMessage = strMessage & "(" & ixTables(t) & ")."
    Else
         strMessage = "String has not been found"
    End If
        
    MsgBox strMessage

End Sub

Open in new window

Regards
0
 
GrahamSkanRetiredCommented:
Thanks Rafael. I can't think why that didn't come out in my testing.
0
 
Andreas HermleTeam leaderAuthor Commented:
Wow, I am impressed. How come that you both know all this? Of course it is partly experience and lots of coding jobs but there is also this gene that all you programmers have and the rest of us not.

Thank you very much for your great help. Regards, Andreas
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.