Bonjour à toutes et tous,

Lorsque je regarde dans les différents newsgroup, blogs, forums, etc ...
C'est très compliqués de parcourir les tableaux Word (surtout si les cellules sont fusionnées).
Cela fait une semaine que je travaille dessus. et j'aimerais partager mon travail (pour ne pas réinventer la roue).

Pour ceux que cela intéresse :
J'ai crées un procédure qui retourne un tableau ayant le même nombre de rangée et de colonnes ainsi qu'un autre petit tableau qui retourne uniquement le nombre de ligne et de colonne.

Remarques importantes:
Vu qu'il n'existe pas d'instructions pour savoir si une cellule est fusionnée ou non, il faut donc traiter les erreurs.

Exemple:
Observez le tableau en haut à gauche. toutes les cellules en bleu sont fusionnées.
Le tableau juste en-dessous, c'est le résultat de la procédure écrite ci-dessous.
Là ou vous voyez un '1', la cellule est accessible. Un '0' non.

Attention, Je mets que la cellule est "accessible".
Cela ne veut pas dire que le contenu au coordonnée : rangée / colonne correspond au réelle coordonnée "vue à l'écran".

Pour preuve. Voyez le contenu du tableau en haut à droite. C'est le contenu du tableau en "mémoire".
La où les cellules sont bleues, se sont les données. le blanc, "rien n'existe".

Lorsque vous fusionnez deux cellules horizontalement, le système déplace toutes les cellules de droite, d'un cran sur la gauche.

Donc: pour la ligne "Teste ligne 13", vous voyez que "toto" est directement suivi de "Y" et la 5ème colonne à disparue. Elle n'existe pas!

Pour l'utiliser

Nom : Tableau.jpg
Affichages : 4507
Taille : 112,9 Ko

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Sub tableControl(tbl As Word.Table, tblResult As Variant, rec As Variant)
    ' tbl       : tableau à contrôler
    ' tblResult : table ayant le même nombre de ligne et de colonne que le tableau ayant les valeurs suivantes:
    '                   0 : La cellule à la coordonnée rangée, colonne est innacessible
    '                   1 : La cellule à la coordonnée rangée, colonne est acessible
    '             Remarque importante: Si des cellules sont fusionnées horizontalement, les cellules suivantes sont shiftées vers la gauche
    '
    ' rec      : tableau contenant 2 valeurs
    '             rec(1,1) = nombre de ligne
    '             rec(1,2) = nombre de colonne
    ' --------------------------------------------------------------------------------------------------------------------------------------
 
    Dim tCell As Word.cell
    Dim tableau() As Variant
    Dim data() As Variant
 
    Dim MaxCl As Integer
    Dim MaxRw As Integer
 
    On Error GoTo ErrHandler
 
    MaxCl = tbl.Columns.Count
    MaxRw = tbl.Rows.Count
 
    ReDim tableau(MaxRw, MaxCl)
    ReDim data(1, 2)
 
    data(1, 1) = MaxRw
    data(1, 2) = MaxCl
 
    For rw = 1 To MaxRw
        GoSub colonne
    Next rw
 
Sortie:
 
    tblResult = tableau
    rec = data
 
    Exit Sub
 
ErrHandler:
    Select Case Err
        Case 5941
            tableau(rw, cl) = 0
            Resume nxtColonne
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description
            Resume Sortie
    End Select
 
colonne:
 
    For cl = 1 To MaxCl
        Set tCell = tbl.cell(rw, cl)
        tableau(rw, cl) = 1
nxtColonne:
    Next cl
    Return
 
End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub test()
    Dim nomfichier As String    ' Nom du fichier Word à traiter
    Dim wordRange As Range      ' Word.Range
    Dim PrevRow As Row          ' Nombre de ligne dans le nouveau tableau AVANT l'ajout
    Dim NewRow As Row           ' Nombre de ligne dans le nouveau tableau APRES l'ajout
 
    Dim t As Integer            ' nombre de tableau dans le document Word
    Dim tr As Integer           ' nombre de ligne dans le tableau en cours de traitement
    Dim tc As Integer           ' nombre de colonne dans le tableau en cours de traitement
    Dim tCell As String         ' Contenu de la cellule(tr,tc) du tableau en cours de traitement
    Dim nCell As String         ' Nouveau contenu de la cellule(tr,tc) du tableau en cours de traitement
    Dim rwdst As Integer        ' numéro de ligne dans le nouveau tableau où sera écrit les valeurs
    Dim ct As Integer           ' numéro utilisé pour le compteur
    Dim nbCol As Integer        ' Problème des cellules mergée
    Dim cl As Integer
    Dim ControlChar As String   ' Caractères de contrôle
    Dim tblChck As Variant      ' tableau contenant l'état des cellules du tableau:
                                '    0 : cellule innaccessible
                                '    1 : cellule accessible
                                ' Attention: si des cellules sont fusionnées horizontalement, toutes les cellules suivantes
                                '            sont shiftées sur la gauche.
                                ' -----------------------------------------------------------------------------------------
    Set wordDoc = ActiveDocument
    wordDoc.ActiveWindow.View.Type = wdNormalView
    tc = wordDoc.Tables.Count   ' Nombre de tableau dans le document
    If tc > 0 Then
        For t = 1 To tc   
            Call tableControl(tableau, tblChck, rec)
            For tr = 1 To rec(1, 1) ' nbre de ligne
                   ' Placez votre traitement ici
            Next tr
       next t
    End if
End Sub
N'hésitez pas à demander si vous avez des questions
Andre