Insérer un tableau dans une cellule d'un tableau [Résolu]

ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 14 juin 2012 à 11:39 - Dernière réponse : ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention
- 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
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 14 juin 2012 à 15:24
3
Merci
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+

Merci bigfish_le vrai 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de bigfish_le vrai
Meilleure réponse
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 15 juin 2012 à 14:55
3
Merci
Salut,

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

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


A+

Merci bigfish_le vrai 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de bigfish_le vrai
Meilleure réponse
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 18 juin 2012 à 15:24
3
Merci
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+

Merci bigfish_le vrai 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de bigfish_le vrai
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 14 juin 2012 à 13:34
0
Merci
Salut,

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

A+
Commenter la réponse de bigfish_le vrai
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 14 juin 2012 à 13:49
0
Merci
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.
Commenter la réponse de ThomasFalguieres
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 14 juin 2012 à 14:16
0
Merci
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.
Commenter la réponse de LIBRE_MAX
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 14 juin 2012 à 14:35
0
Merci
ou tout simplement :
docWord.Tables(numtabOVVlisting).Cell(1, 1).Range.Text = "test1"


[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 14 juin 2012 à 14:43
0
Merci
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 ?
Commenter la réponse de ThomasFalguieres
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 14 juin 2012 à 15:28
0
Merci
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+
Commenter la réponse de bigfish_le vrai
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 14 juin 2012 à 15:48
0
Merci
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...)
Commenter la réponse de ThomasFalguieres
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 14 juin 2012 à 16:28
0
Merci
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+
Commenter la réponse de bigfish_le vrai
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 14 juin 2012 à 16:32
0
Merci
Désolé, en plus j'y ai pensé et aussi vite oublié.

Voici la réponse validée

Encore merci
Commenter la réponse de ThomasFalguieres
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 15 juin 2012 à 11:58
0
Merci
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
Commenter la réponse de ThomasFalguieres
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 15 juin 2012 à 15:02
0
Merci
...

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+
Commenter la réponse de bigfish_le vrai
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 18 juin 2012 à 08:49
0
Merci
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 )
Commenter la réponse de ThomasFalguieres
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 18 juin 2012 à 13:47
0
Merci
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
Commenter la réponse de ThomasFalguieres
ThomasFalguieres 36 Messages postés mardi 21 février 2012Date d'inscription 11 juillet 2012 Dernière intervention - 18 juin 2012 à 16:00
0
Merci
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
Commenter la réponse de ThomasFalguieres

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.