Option Explicit
Sub ParcourirParagraphesTabMultiLignes()
    Dim wdWapp As Object ' .......................................................................................... Application Word
    Dim wdDoc As Document ' ......................................................................................... Le document word en cours d'analyse
    Dim wdParagraphe As Paragraph ' ................................................................................. Chaque paragraphe du document Word en cours
' Compteur
    Dim wdNbParagph As Long ' ....................................................................................... le numéro du paragraphe en cours
    Dim wdNbLignesParagph As Long ' ................................................................................. le nombre de lignes de chaque paragraphe
    Dim wdLigneIndex As Long ' ...................................................................................... l'index de la ligne en cours du paragraphe
    Dim wdTexteLigne As String ' .................................................................................... Texte de la ligne
    Dim wdWin As Long: wdWin = 1 ' .................................................................................. Numéro de la fenêtre Word (dans ce cas, la première fenêtre)
    Dim wdNoPage As Long: wdNoPage = 1 ' ............................................................................ Numéro de la page Word (dans ce cas, la première page)
' Les tableaux
    Dim wdTbl As Table ' ............................................................................................ Variable pour stocker une référence à un tableau dans le document Word
    Dim wdCel As Cell ' ............................................................................................. Variable pour stocker une référence à une cellule dans un tableau dans le document Word
    Set wdWapp = CreateObject("Word.Application") ' Créer une instance de l'application Word
        wdWapp.Visible = True    ' .................................................................................. Rendre l'application Word visible (facultatif)
' Ouvrir le document spécifié
    Set wdDoc = wdWapp.Documents.Open("E:\00_17-04-2024\Module VBA - PDF to Word_2024-04-17\" _
                                       & "Pour_Test_Images_Tableaux_Paragraphes Simple et MultilignesFacture.docx")
        wdDoc.Range(0, 0).Select ' .................................................................................. Déplacer la sélection au début du document
' Parcourir chaque paragraphe dans le document
    For Each wdParagraphe In wdDoc.Paragraphs
        wdNbParagph = wdNbParagph + 1 ' ............................................................................. Vérifier si le paragraphe n'est pas vide
        If Len(wdParagraphe.Range.Text) > 1 Then
            ' Si le paragraphe est dans un tableau Alors :
                If wdParagraphe.Range.Information(wdWithInTable) Then
                    If wdParagraphe.Range.Cells.Count > 0 Then
                        Set wdTbl = wdParagraphe.Range.Tables.Item(1) ' ............................................. Obtenir le tableau
                            Set wdCel = wdParagraphe.Range.Cells(1) ' ............................................... Obtenir la première cellule
                                If wdCel.RowIndex = 1 And wdCel.ColumnIndex = 1 Then
                                    'Debug.Print wdTbl.Cell(wdCel.RowIndex, wdCel.ColumnIndex).Range.Text ' ......... Afficher le texte de la cellule (du Tableau en cour)
                                                wdTbl.Cell(wdCel.RowIndex, wdCel.ColumnIndex).Range.Select ' ........ Sélectionner le contenu de la cellule (du Tableau en cour)
                                    ' Comme le curseur est actuellement dans la premiére cellule du tableau
                                                wdTbl.Select ' ...................................................... Sélectionne le premier tableau trouvé
                                    ' Bonus : debug.print de tableau à 2 dimensions
                                                Dim Tb2d() As Variant
                                            ' Redimensionnez la variable tableau 2D en fonction de la taille du tableau Word
                                                Dim regEx As Object
                                                    Set regEx = CreateObject("VBScript.RegExp")
                                                        regEx.Global = True
                                                        regEx.IgnoreCase = True
                                                        regEx.Pattern = "[\n\r\f\v]" ' Motif pour trouver les retours à la ligne, les retours chariot, etc.
                                                ReDim Tb2d(1 To wdTbl.Rows.Count, 1 To wdTbl.Columns.Count)
                                                Dim ligne As Long
                                                Dim colonne  As Long
                                                Dim n As Variant
                                                Dim maligne As String
                                                ' Boucle à travers chaque cellule du tableau Word et copiez-la dans la variable tableau 2D
                                                For ligne = 1 To wdTbl.Rows.Count
                                                    maligne = ""
                                                        For colonne = 1 To wdTbl.Columns.Count
                                                            Tb2d(ligne, colonne) = regEx.Replace(wdTbl.Cell(ligne, colonne).Range.Text, "") ' Supprime les retours à la ligne
                                                            'maligne = maligne & Tb2d(ligne, colonne) & " "
                                                            maligne = maligne & Tb2d(ligne, colonne) & vbTab  ' Ajoutez le contenu de la cellule avec un séparateur de tabulation
                                                        Next colonne
                                                Debug.Print Left(maligne, Len(maligne) - 1)
                                                Next ligne
                                                ligne = Empty: colonne = Empty: n = Empty: maligne = Empty
                                ' Non Utilisé ici.
                                ' Car le tableau doit être selectionné qu'une seule fois dans la boucle (PARAGRAPHE !)
                                ' Else
                                    'vDebug.Print wdTbl.Cell(wdCel.RowIndex, wdCel.ColumnIndex).Range.Text ' ........ Afficher le texte de la cellule suivante (du Tableau en cour)
                                               ' wdTbl.Cell(wdCel.RowIndex, wdCel.ColumnIndex).Range.Select ' ....... Sélectionner le contenu de la cellule suivante (du Tableau en cour)
                                End If
                    End If
                Else
            ' Si le Paragraphe n'est pas dans un tableau Alors :
                wdNbLignesParagph = wdParagraphe.Range.ComputeStatistics(wdStatisticLines) ' ........................ Obtenir le nombre de lignes du paragraphe
                    If wdNbLignesParagph = 1 Then ' ................................................................. Si le paragraphe a une seule ligne
                        ' Si le Paragraphe a une seule ligne Alors : ................................................ Sélectionner la ligne en cours
                            wdTexteLigne = wdParagraphe.Range.Text ' ................................................ Récupérer le texte de la ligne
                            Debug.Print wdTexteLigne ' .............................................................. Afficher le texte de la ligne dans la fenêtre de débogage
                            wdParagraphe.Range.Select ' ............................................................. Sélectionner la ligne
                    Else
                        'Si le Paragraphe comporte plusieurs lignes Alors : Sélectionner la ligne en cours
                            For wdLigneIndex = 1 To wdNbLignesParagph ' ............................................. Parcourir chaque ligne du paragraphe
                                Debug.Print wdWapp.Windows(wdWin).ActivePane.Pages(wdNoPage).Rectangles(wdNbParagph) _
                                            .Lines(wdLigneIndex).Range.Text ' ....................................... Afficher le texte de la ligne en cours
                                            wdWapp.Windows(wdWin).ActivePane.Pages(wdNoPage).Rectangles(wdNbParagph) _
                                            .Lines(wdLigneIndex).Range.Select ' ..................................... Sélectionner la ligne
                            Next wdLigneIndex
                    End If
                End If
        End If
    Next wdParagraphe
End Sub