Insérer un tableau dans une cellule d'un tableau

Résolu
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012 - 14 juin 2012 à 11:39
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012 - 18 juin 2012 à 16:00
Bonjour,

J'aimerais savoir s'il est possible en VBA Word d'insérer un tableau dans un tableau. J'ai un tableau de 3 lignes par 3 colonnes et voudrais insérer dans la cellule de la première colonne première ligne un autre tableau (Tableau dans un tableau).

J'ai cherché sur le net et n'ai rien trouvé. Personne n'a posé la question dans le passé (il se peut aussi que ma recherche n'aie pas été optimale...).

J'ai essayé par moi même d'y arriver avec le code suivant mais cela ne marche pas. Je vous donne tout de même le code qui peut-être donnera des idées, ou doit être corrigé:

Set appWord = New Word.Application
Dim docWord As New Word.Document

Dim numtabOVVlisting  as integer, numtabOVVlist as integer

'On insère le tableau pour le listing des OVV
Set contenu = docWord.content
contenu.Collapse Direction:=wdCollapseEnd
docWord.Tables.Add Range:=contenu, NumRows:=3, NumColumns:=3

'On récupère le numéro du tableau précédemment crée
numtabOVVlisting = docWord.Tables.Count
                    
'On donne un thème au tableau
With docWord.Tables(numtabOVVlisting)
                        
     'on définit le style du tableau
     .Style = ("Grille du tableau")
                        
End With
                    
'***********************
'TEST*******************
'***********************
                    
With docWord.Tables(numtabOVVlisting).Cell(1, 1)

'On crée le tableau à insérer dans la cellule de la première colonne, première ligne
Set contenu = docWord.content
contenu.Collapse Direction:=wdCollapseEnd
docWord.Tables.Add Range:=contenu, NumRows:=2, NumColumns:=3
                        
numtabOVVlist = docWord.Tables.Count
                    
'On donne un thème au tableau
With docWord.Tables(numtabOVVlist)
                        
     'on définit le style du tableau
     .Style = ("Grille du tableau")
                        
End With

'On écrit dans la cellule (1;1) du tableau contenue dans la cellule (1;1) de l'autre tableau                    
docWord.Tables(numtabOVVlisting).Cell(1, 1).Tables(numtabOVVlist).Cell(1, 1).Range.Text = "test1"
                    
End With


Lorsque j'écris l'instruction pour écrire dans la cellule (1;1), cette instruction est syntaxiquement correcte et bien compilée.

Problème: lorsque je l'exécute en pas-à-pas, j'ai une erreur 'erreur 5941' disant que "Le membre de la collection requis n'existe pas".

Quelqu'un aurait-il une idée ?

Je vous remercie d'avance

Thomas

17 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 juin 2012 à 15:24
Re,

je pense que la méthode n'est pas bonne car il existe une méthode qui permet d’imbriquer les tableaux voici un exemple simple qu'il te faudra adapter à ton besoin :
Sub Demo()
    Dim matable As Table
    Set matable = ActiveDocument.Tables.Add(Selection.Range, NumRows:=3, NumColumns:=3)
    With matable.Range
        .Cells(1).Range.Text = .Cells(1).NestingLevel 'definit le niveau de la cellule avant imbrication
        With .Cells(1)
           .Tables.Add .Range, 3, 3 'creation de la table imbriquée
        End With
    End With
End Sub


Note que l'imbrication peu se faire par une méthode copy/paste

A+
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
15 juin 2012 à 14:55
Salut,

essai d'ajouter selection devant .range, comme ceci :

.Tables.Add Selection.Range, 3, 3, , wdAutoFitContent 'creation de la table imbriquée


A+
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
18 juin 2012 à 15:24
Salut,

non pas de problème le boulet c'est word

With docWord.Tables(numLastTab).Cell(2, 3).Range
            
    'On saute deux lignes
    .InsertAfter Chr(10)
    'definit le niveau de la cellule avant imbrication
    .Cells(1).Range.InsertAfter .Cells(1).NestingLevel
                
     With .Cells(1)
           'on ce place en fin de cellule
           .Range.Select
           Selection.EndOf (wdCell)     
          'On crée la table
          .Tables.Add Range:=appWord.Selection.Range, NumRows:=3, NumColumns:=3 'creation de la table imbriquée
                                                
     End With
                            
End With


voila essai mais je ne garantie rien !

A+
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 juin 2012 à 13:34
Salut,

déjà avant de vouloir le faire par code à essayé et réussi en le faisant manuellement ?

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
14 juin 2012 à 13:49
Oui j'ai essayé manuellement et c'est possible, c'est pour cela que je me dis qu'il y a possibilité de le faire et que je post

De plus je pense ne pas être pas loin de la solution (du moins dans la philosophie) avec le code que j'ai écrit. Je pense que la syntaxe n'est pas bonne ou que je ne crée pas mon tableau correctement au bon moment.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
14 juin 2012 à 14:16
Bonjour,

fais un msgbox sur numtabOVVlisting, juste après:
'On récupère le numéro du tableau précédemment crée
numtabOVVlisting = docWord.Tables.Count

pour s' assurer du contenu..

[] Ce qui va sans dire. va mieux en le disant.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
14 juin 2012 à 14:35
ou tout simplement :
docWord.Tables(numtabOVVlisting).Cell(1, 1).Range.Text = "test1"


[] Ce qui va sans dire. va mieux en le disant.
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
14 juin 2012 à 14:43
J'ai finalement trouvé la solution:

docWord.Tables.Add Range:=docWord.Tables(numtabOVVlist).Cell(1, 1).Range, NumRows:=3, NumColumns:=6


Un problème réside encore, je ne peux faire que des tableaux de 1 ligne fois x(plusieurs) colonnes. Je ne comprends pas pourquoi car quand j'exécute l'instruction me permettant d'écrire dans la deuxième ligne, cela s'exécute correctement
Voici finalement mon code:

docWord.Tables.Add Range:=docWord.Tables(numtabOVVlist).Cell(1, 1).Range, NumRows:=3, NumColumns:=6
     
'On récupère le numéro du tableau précédemment crée dans la cellule Cell(1, 1)               
numtabOVV = docWord.Tables(numtabOVVlist).Tables.Count
                                        
'On donne un thème au tableau
With docWord.Tables(numtabOVVlist).Tables(numtabOVV)
                        
     'on définit le style du tableau
      .Style = ("Grille du tableau")
                        
End With
 
'On écrit dans le tableau contenu dans la cellule                  
 docWord.Tables(numtabOVVlisting).Cell(1, 1).Tables(numtabOVV).Cell(1, 1).Range.Text = "test1"
 docWord.Tables(numtabOVVlisting).Cell(1, 1).Tables(numtabOVV).Cell(1, 2).Range.Text = "test12"
 docWord.Tables(numtabOVVlisting).Cell(1, 1).Tables(numtabOVV).Cell(2, 1).Range.Text = "test2"
 docWord.Tables(numtabOVVlisting).Cell(1, 1).Tables(numtabOVV).Cell(3, 1).Range.Text = "test3"


Seules les deux premières instructions d'écriture dans le tableau marchent donc au niveau de la ligne N°1 du tableau. Les autres s'exécutent correctement mais n'ont aucun effet

Une idée ?
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 juin 2012 à 15:28
ah oui j'ai oublier de t'expliquer le pourquoi de ma première question !

si tu sais le faire manuellement et que tu avais utilisé l'enregistreur de macro tu aurais été mis sur la piste de cette méthode !

Donc pense à l'enregistreur de macro !

A+
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
14 juin 2012 à 15:48
Je tiens à te dire un [size=300]GRAND GRAND
/size merci

Ça marche impeccable, c'est propre, c'est parfait

En effet je n'avais pas compris lorsque tu m'avais demandé si manuellement c'était réalisable !! Je l'avais fait à la main dans un word quoi...le boulet !! J'avais absolument pas pensé à utiliser l'enregistreur de macro !! Alors que c'est une idée géniale en plus !!

Merci beaucoup d'avoir consacré du temps sur le problème et merci pour le conseil par rapport à l'enregistreur de macro !! Ton aide m'a été très précieuse !! (Depuis milieu de matinée que j'étais la dessus...)
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 juin 2012 à 16:28
De rien

Il serait bien pour ceux qui aurait la même question, que tu valide la réponse en cliquant sur le bouton [réponse acceptée]

A+
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
14 juin 2012 à 16:32
Désolé, en plus j'y ai pensé et aussi vite oublié.

Voici la réponse validée

Encore merci
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
15 juin 2012 à 11:58
Salut,

je reviens vers toi car j'ai un autre problème et je commence à devenir fou
Pour ce qui est d'insérer un tableau dans un autre, le problème est complètement résolu mais maintenant, j'en ai un autre: en effet, avant d'insérer mon tableau dans la cellule du premier tableau, j'écris des choses. Ce que je veux faire c'est ajouter mon tableau à la suite de ces quelques lignes.

J'ai bataillé toute la matinée mais impossible de trouver la solution; quand j'en arrive à insérer le tableau, tout le contenu de la cellule disparait, donc les quelques lignes que j'écris avant d'insérer le tableau.

je te montre le code ci-dessous:

'On écrit les "quelques lignes" dans la cellule avant d'insérer le tableau
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "DATE"
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter Chr(13)
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "TEST MEANS"
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter Chr(13)
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "STATUS"
docWord.Tables(numLastTab).Cell(2, 3).Range.Font.Bold = False
            
            
'************************************************
'CREATION TABLEAU DANS TABLEAU*******************
'************************************************
                                                                    
with docWord.Tables(numLastTab).Cell(2, 3).Range
     'On saute deux lignes
     .InsertAfter Chr(10)
     .InsertParagraphAfter
     'definit le niveau de la cellule avant imbrication
     .Cells(1).Range.InsertAfter .Cells(1).NestingLevel
                
     With .Cells(1)
     'On crée la table ET C'EST A CE MOMENT LA QUE MON CONTENU DISPARAIT
     .Tables.Add .Range, 3, 3, , wdAutoFitContent 'creation de la table imbriquée
     End With
                            
 End With
            
            numtabOVV = docWord.Tables(numLastTab).Tables.Count
            
            'On donne un thème au tableau
            With docWord.Tables(numLastTab).Tables(numtabOVV)
                        
                'on définit le style du tableau
                .Style = ("Grille du tableau")
                        
            End With
                    
docWord.Tables(numLastTab).Cell(2, 3).Tables(numtabOVV).Cell(1, 1).Range.Text = "test1"
docWord.Tables(numLastTab).Cell(2, 3).Tables(numtabOVV).Cell(1, 2).Range.Text = "test12"
docWord.Tables(numLastTab).Cell(2, 3).Tables(numtabOVV).Cell(2, 1).Range.Text = "test2"
docWord.Tables(numLastTab).Cell(2, 3).Tables(numtabOVV).Cell(3, 1).Range.Text = "test3"


Aurais-tu une idée car j'avoue que j'ai tout essayé et je tourne en rond ?

Merci d'avance

Thomas
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
15 juin 2012 à 15:02
...

n'oublie pas que la cellule qui reçoit le tableau imbriqué fonctionne alors comme le range de la page. Le tableau sera imbriqué au niveau du curseur(selection). Donc si besoin est, il te faudra positionner la selection à l'endroit ou tu veux imbriquer le tableau.

A+
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
18 juin 2012 à 08:49
Bonjour,

Désolé de ne pas avoir répondu avant mais je n'étais pas sur place vendredi après-midi.

En effet je me disais bien que le nouveau range de la page correspondait à celui de ma cellule mais je me disais qu'il le ferait par défaut et qu'il n'y avait pas nécessité de l'indiquer.

Donc encore une fois je tiens à te remercier car tu as vu juste Grâce à toi j'arrive à faire ce que je veux sur le tableau, chose que je pensais impossible au début

Encore une fois, je tiens à te remercier pour ton aide !!

Thomas

(Je n'oublierai pas cette fois d'accepter la réponse de suite après )
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
18 juin 2012 à 13:47
Salut,

Je reviens vers toi car j'ai de nouveau un problème. Quel boulet vas-tu te dire...pourtant j’essaie vraiment de comprendre mais je pense que cela me dépasse la. Autant la communication avec base de donnée et tout le reste aucun problème, autant la mise en page je suis pas fier.

En fait, avec la ligne que tu m'as donné plus haut(un peu modifiée), cela marche mais seulement en débug. Je m'explique: lorsque je crée le document et que je fais la mise en page, je le rends visible ce qui me permet de voir pas-à-pas l'impact/conséquences de mes instructions/actions de mon programme.
Lorsque j'arrive à l'instruction de l'ajout de la table, je vais dans le doc et clic dans la cellule où je veux insérer mon tableau, ce qui me donne le bon "range". Si je ne fais pas ça, le tableau est automatiquement ajouté en tout début de mon document, là où se trouve au final mon curseur. Quand je parle de curseur j’entends le caractère "|" qui clignote.

Je te joint mon code afin que tu vois ce qui s'exécute:


'On écrit les "quelques lignes" dans la cellule avant d'insérer le tableau
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "DATE"
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter Chr(13)
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "TEST MEANS"
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter Chr(13)
docWord.Tables(numLastTab).Cell(2, 3).Range.InsertAfter "STATUS"
docWord.Tables(numLastTab).Cell(2, 3).Range.Font.Bold = False
            
            
'************************************************
'CREATION TABLEAU DANS TABLEAU*******************
'************************************************

With docWord.Tables(numLastTab).Cell(2, 3).Range
            
    'On saute deux lignes
    .InsertAfter Chr(10)
    'definit le niveau de la cellule avant imbrication
    .Cells(1).Range.InsertAfter .Cells(1).NestingLevel
                
     With .Cells(1)
                    
          'On crée la table
          .Tables.Add Range:=appWord.Selection.Range, NumRows:=3, NumColumns:=3 'creation de la table imbriquée
                                                
     End With
                            
End With
            
numtabOVV = docWord.Tables(numLastTab).Tables.Count
            
'On donne un thème au tableau
With docWord.Tables(numLastTab).Tables(numtabOVV)
                        
'on définit le style du tableau
    .Style = ("Grille du tableau")
                        
End With


Je ne comprends pas pourquoi lorsque j'écris mes quelques lignes avant l'insertion du tableau, elles sont écrites au bon endroit(à savoir dans la cellule), et pourquoi le tableau serait inséré en tête de document. Pourquoi le "range courant" changerait-il d'un coup de ma cellule à tout en haut du doc ?

Est-ce que le fait que je marque "Range:=appWord.Selection.Range" lui donne un autre range que celui de la cellule du tableau ?

Je sais que tu m'as déjà beaucoup aidé, mais te serait-il possible de m'éclairer ?

Je te remercie d'avance.

Thomas
0
ThomasFalguieres Messages postés 36 Date d'inscription mardi 21 février 2012 Statut Membre Dernière intervention 11 juillet 2012
18 juin 2012 à 16:00
Tu es impressionant Tu es mon maître VBA sans rire !! Si pour moi il y a des zones d'ombre, pour toi il est clair qu'il n'y en a pas !!

Ça marche pour le coup parfaitement sans que je n'ai besoin de retoucher quoi que se soit à la main; j'ai aussi essayé de continuer hors du tableau la création de mon document et c'est impeccable

Merci mille fois !! Vraiment merci Car je suis en train de développer une application VBA au travail(je suis en réalité stagiaire M2) et l'application doit générer toute seule des documents et cet aspect là (le tableau dans le tableau avec la mise en forme adéquate) était très attendue par mes chefs.

On peut dire que tu m'as sorti du pétrin !!

Encore merci beaucoup !!

Très cordialement,

Thomas
0
Rejoignez-nous