Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Copier / Coller un tableau Word depuis Excel


Sujet :

VBA Word

  1. #1
    Nouveau Candidat au Club
    Copier / Coller un tableau Word depuis Excel
    Bonjour à tous,

    Cela fait quelques jours que je tente du code dans une macro Excel afin de copier / coller un tableau d'un document Word dans lui-même, je m'explique :

    Je souhaite créer un classeur Excel qui me permettrait d'automatiser un rapport au format docx ou pdf à partir d'un document type. En entrant les données dans mon classeur excel et en cliquant sur un bouton il doit alors me créer mon rapport. Cela fonctionne plutôt bien pour modifier du texte, mais je bloque pour copier / coller les tableaux. En effet, dans mon document type il y a un tableau dans lequel je dois ajouter les différents dégâts constatés sur un ouvrage. Le tableau n'a que 5 lignes et donc si j'ai plus de 5 dégâts j'aimerais copier / coller ce tableau pour que je puisse continuer le processus.

    Ce que je souhaite faire : je connais le nombre de tableau dont j'ai besoin. J'aimerais donc copier coller autant de fois le tableau que nécessaire puis les remplir par la suite. Seulement, avec le code ci-dessous, la macro ne fait rien du tout.

    J'ajoute que le code ci-dessous à peine modifié fonctionne dans une macro Word. Je pense donc qu'il y a un problème au niveau du WordDocumentToModify mais j'ai essayé plusieurs solutions et aucune ne fonctionne.

    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            For i = 1 To nbrTableDegat ' nbrTableDegat = le nombre de tableau à ajouter
     
                With WordDocumentToModify 'il s'agit d'un "Word.Document" dans lequel j'aimerai travailler. J'ai essayé avec ActiveDocument également.
     
                    Selection.Tables(numTableDegat).Select ' numTableDegat et l'indice du tableau du document type.
                    Selection.Range.Copy
                    Selection.MoveDown Unit:=wdLine, Count:=1
                    Selection.PasteAndFormat (wdTableOriginalFormatting)
                    Selection.Tables(numTableDegat).Columns(1).Cells(7).Select
                    Selection.SplitTable
     
                End With
     
            Next i


    Merci d'avance pour votre aide, j'espère avoir été claire dans ce que je souhaite faire.

  2. #2
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Bonjour,

    Si vous travaillez d'Excel vers Word, il vous faut instancier une variable Word.selection. Les "Selection" que vous utilisez dans ce code relèvent d'Excel. Quel nom avez-vous donné à votre instance Word ?
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  3. #3
    Nouveau Candidat au Club
    Bonjour Eric et merci de votre réponse rapide,

    Mon instance s'appelle WordInstance (si je ne dis pas de bêtise).
    Je pense que je n'ai pas bien saisi ce qu'étais une instance, alors si vous avez une documentation qui l'explique je suis preneur.

    Ce que je comprend : j'applique une .Selection sur un document word WordDocumentToModify.
    Je ne comprend pas ce qu'il manque à Excel pour qu'il comprenne qu'il doit aller sur l'application Word.

    Code VBA :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
    Dim WordInstance As Word.Application
    Dim WordDocumentToModify As Word.Document
     
        If nbrTableDegat > 1 Then
            For i = 1 To nbrTableDegat
     
                With WordDocumentToModify
     
                    .Selection.Tables(numTableDegat).Select
                    .Selection.Range.Copy
                    .Selection.MoveDown Unit:=wdLine, Count:=1
                    .Selection.PasteAndFormat (wdTableOriginalFormatting)
                    .Selection.Tables(numTableDegat).Columns(1).Cells(7).Select
                    .Selection.SplitTable
     
                End With
     
            Next i
        End If


    Merci pour votre aide.

  4. #4
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Un exemple fonctionnant depuis Excel. Le répertoire contient un modèle .dotx dans lequel est présente la table qui sera dupliquée N fois :
    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
     
     
    Sub TestDupliquerLesTables()
     
    Dim WordInstance As New Word.Application  ' New instancie l'application Word dans la mesure où la DLL Word est cochée.
    Dim WordDocumentToModify As Word.Document
    Dim RepertoireDoc As String, NomModeleWord As String
     
        RepertoireDoc = "D:\XXXXXXX\"   ' A adapter
        NomModeleWord = RepertoireDoc & "Doc modèle.dotx"
     
        With WordInstance
             .Visible = True
             Set WordDocumentToModify = .Documents.Add(Template:=NomModeleWord)
        End With
     
        DupliquerLesTables WordInstance, WordDocumentToModify, 5
     
        Set WordDocumentToModify = Nothing
        Set WordInstance = Nothing
     
    End Sub
     
     
     
    Sub DupliquerLesTables(ByVal InstanceWord As Word.Application, ByVal DocAModifier As Word.Document, ByVal NbTables As Integer)
     
    Dim SelectionWord As Word.Selection
    Dim I As Integer
     
        Set SelectionWord = InstanceWord.Selection
        With DocAModifier
     
             For I = 1 To NbTables - 1
                 .Tables(1).Range.Copy
                 With SelectionWord
                      .EndKey unit:=wdStory ', Count:=1
                      .InsertParagraph
                      .MoveDown unit:=wdLine, Count:=1
                      .Paste
                End With
            Next I
        End With
     
        Set SelectionWord = Nothing
     
    End Sub
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  5. #5
    Nouveau Candidat au Club
    Merci Eric pour votre réponse.

    Je suis presque arrivé à la solution désirée.
    Je ne sais seulement pas utiliser la commande EndKey afin que le tableau créé soit collé sous mon tableau n° numTableDegat.
    J'ai tenté de regarder la documentation Microsoft et si je comprend bien je devrais utiliser wdLine à la place de wdStory seulement il faudrait que je sélectionne le tableau n° numTableDegat avant non ?

    Merci d'avance et bonne journée .

  6. #6
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Bonjour,

    Je ne comprends pas le problème, la procédure DupliquerLesTables crée une ligne sous chaque tableau.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  7. #7
    Nouveau Candidat au Club
    Bonjour,

    Oui cela fonctionne seulement s'il n'y a rien à la suite du tableau. Dans mon cas, après le tableau mon rapport n'est pas terminé.
    J'ai essayé dans un autre document word en créant deux tableaux différent et en copiant seulement le premier. Résultat : il se met bien à la fin du document et non pas à la suite du premier tableau.

    Avant la macro :


    Après la macro :


    J'aimerais, dans cet exemple, que les tableaux bleus soient placés avant le tableau rouge. Auriez-vous une piste ?

    Merci d'avance !

  8. #8
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Il serait assez judicieux de mettre votre code en ligne.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  9. #9
    Nouveau Candidat au Club
    Merci pour votre rapidité,

    J'ai copié votre code en remplaçant le chemin du document word.
    Le document word ne contient que deux tableaux, comme la première image que j'ai jointe ci-dessus.

    Code VBA :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
    Sub TestDupliquerLesTables()
     
    Dim WordInstance As New Word.Application  ' New instancie l'application Word dans la mesure où la DLL Word est cochée.
    Dim WordDocumentToModify As Word.Document
    Dim RepertoireDoc As String, NomModeleWord As String
     
        RepertoireDoc = "C:\Users\Arnaud\Desktop\"   ' A adapter
        NomModeleWord = RepertoireDoc & "test.docx"
     
        With WordInstance
             .Visible = True
             Set WordDocumentToModify = .Documents.Add(Template:=NomModeleWord)
        End With
     
        DupliquerLesTables WordInstance, WordDocumentToModify, 5
     
        Set WordDocumentToModify = Nothing
        Set WordInstance = Nothing
     
    End Sub
     
     
     
    Sub DupliquerLesTables(ByVal InstanceWord As Word.Application, ByVal DocAModifier As Word.Document, ByVal NbTables As Integer)
     
    Dim SelectionWord As Word.Selection
    Dim I As Integer
     
        Set SelectionWord = InstanceWord.Selection
        With DocAModifier
     
             For I = 1 To NbTables - 1
                 .Tables(1).Range.Copy
                 With SelectionWord
                      .EndKey unit:=wdStory ', Count:=1
                      .InsertParagraph
                      .MoveDown unit:=wdLine, Count:=1
                      .Paste
                End With
            Next I
        End With
     
        Set SelectionWord = Nothing
     
    End Sub

  10. #10
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    D'où vient le tableau rouge ?
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  11. #11
    Nouveau Candidat au Club
    Je vous prie de m'excuser, peut-être que je n'ai pas été clair.

    Mon document word est un modèle type dans lequel seuls certaines informations doivent être modifiées.
    J'ai en fait un tableau que je souhaite copier N fois. Le tableau en question et celui ci-dessous.
    Page 1 :

    La page suivante et faite d'un autre tableau dans lequel seul le texte en jaune est modifié (pour ceci, j'ai déjà trouvé une solution qui fonctionne dans ma macro).
    Page 2:

    Je souhaite "simplement" que le tableau 1 soit copié plusieurs fois à la suite avant la page 2.

    Je ne sais si c'est clair ?

    Merci encore.

  12. #12
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    En admettant qu'un paragraphe vide existe avant le tableau 1, le code ci-dessous crée les tableaux au dessus du tableau 1 :

    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
     
     
    Sub DupliquerLesTablesAvant(ByVal InstanceWord As Word.Application, ByVal DocAModifier As Word.Document, ByVal NbTables As Integer)
     
    Dim SelectionWord As Word.Selection
    Dim I As Integer
     
        Set SelectionWord = InstanceWord.Selection
        With DocAModifier
     
             For I = 1 To NbTables - 1
                 .Tables(1).Range.Copy
                 With SelectionWord
                      .HomeKey unit:=wdStory
                      .InsertParagraphBefore
                      .MoveDown unit:=wdLine, Count:=1
                      .Paste
                End With
            Next I
        End With
     
        Set SelectionWord = Nothing
     
    End Sub
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  13. #13
    Nouveau Candidat au Club
    Bonjour à tous,

    Je reviens sur le sujet car je n'ai toujours pas trouvé une solution.
    J'ai testé la solution d'Eric qui ne fonctionne pas pour mon cas.
    En imaginant que j'aie 3 tableaux, j'aimerais copier et coller le tableau n°2 juste au-dessus ou au-dessous de ce même tableau n°2.
    La solution d'Eric me colle les tableau soit au tout début du document (avant le tableau n°1) soit tout à la fin (après le tableau n°3).
    Mon code n'a pas changé car la solution d'Eric est celle qui est la plus proche de ce dont j'ai besoin.

    Je vous prie de m'excuser de revenir plusieurs fois sur le même problème.

    Merci d'avance !

  14. #14
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Les tableaux étant identiques et devant être alignés les uns en dessous des autres, quelle est la nécessité de faire cela ?

    Si malgré tout, vous souhaitez modifier l'ordre des tableaux, rien ne vous interdit de travailler avec les objets Table.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  15. #15
    Nouveau Candidat au Club
    Bonjour Eric,

    le code ci-dessous fonctionne si je prend un document "test" en effet.
    Le document NomModelWord est composé de 3 tableaux (un rouge un bleu un vert). Le code ci-dessous copie / colle 4 tableaux bleus entre le rouge et le bleu d'origine.
    C'est exactement ce que j'aimerais faire sur mon document type.

    Code VBA :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
    Sub TestDupliquerLesTables()
     
    Dim WordInstance As New Word.Application  ' New instancie l'application Word dans la mesure où la DLL Word est cochée.
    Dim WordDocumentToModify As Word.Document
    Dim RepertoireDoc As String, NomModeleWord As String
     
        RepertoireDoc = "C:\Users\Arnaud\Desktop\"   ' A adapter
        NomModeleWord = RepertoireDoc & "test.docx"
     
        With WordInstance
             .Visible = True
             Set WordDocumentToModify = .Documents.Add(Template:=NomModeleWord)
        End With
     
        DupliquerLesTables WordInstance, WordDocumentToModify, 5
     
        Set WordDocumentToModify = Nothing
        Set WordInstance = Nothing
     
    End Sub
     
     
     
    Sub DupliquerLesTables(ByVal InstanceWord As Word.Application, ByVal DocAModifier As Word.Document, ByVal NbTables As Integer)
     
    Dim SelectionWord As Word.Selection
    Dim I As Integer
     
        Set SelectionWord = InstanceWord.Selection
        With DocAModifier
     
             For I = 1 To NbTables - 1
                 .Tables(2).Range.Copy
                 With SelectionWord
                      .HomeKey unit:=wdStory
                      .MoveDown unit:=wdLine, Count:=1
                      .PasteAndFormat (wdTableOriginalFormatting)
                      .Tables(1).Columns(1).Cells(3).Select
                      .SplitTable
                End With
     
            Next I
        End With
     
        Set SelectionWord = Nothing
     
    End Sub



    J'ai alors copié le code est collé dans ma macro

    Code VBA :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
    Sub DupliquerLesTables(ByVal InstanceWord As Word.Application, ByVal DocAModifier As Word.Document, ByVal NbTables As Integer, ByVal NumTables As Integer)
     
    Dim SelectionWord As Word.Selection
    Dim I As Integer
     
        Set SelectionWord = InstanceWord.Selection
        With DocAModifier
     
             For I = 1 To NbTables - 1
                 .Tables(NumTables).Range.Copy
                 With SelectionWord
                      .EndKey unit:=wdStory ' , Count:=1
                      .MoveDown unit:=wdLine, Count:=1
                      '.TypeParagraph
                      .PasteAndFormat (wdTableOriginalFormatting)
                      '.Tables(NumTables - 1).Columns(1).Cells(7).Select
                      '.SplitTable
                End With
            Next I
        End With
     
        Set SelectionWord = Nothing
     
    End Sub


    Seulement cette fois ça ne fonctionne plus. Le tableau est copié tout à la fin du document. J'aimerais que le tableau soit copié ou il y a la flèche rouge.




    J'ai également tenté de remplacer EndKey par HomeKey mais la macro ne fait plus rien du tout.

    Merci pour votre aide !

  16. #16
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Bonjour,

    Le plus simple serait de créer N signets dans votre document type et espacés d'une ligne puis de coller vos tableaux sur ces signets. Les signets (les paragraphes) en trop pourraient ensuite être supprimés.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  17. #17
    Nouveau Candidat au Club
    Merci pour votre aide Eric.

    Sinon je pensais aussi à :

    Aajouter 6 lignes en dessous de mon tableau (qui deviendrait alors un tableau de 12 lignes).
    Copier les 6 premières lignes et les coller dans les 6 dernières.
    Finalement séparer le tableau en deux parties.

    Je suis en train d'essayer de faire cela mais je ne sais pas si cela va fonctionner.

  18. #18
    Expert éminent sénior
    Citation Envoyé par arnadelf Voir le message

    Le plus simple est de travailler avec le range des signets.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

###raw>template_hook.ano_emploi###