IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut 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
    Invité
    Invité(e)
    Par défaut
    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 ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    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.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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 :
    Nom : Capture1.PNG
Affichages : 758
Taille : 4,8 Ko

    Après la macro :
    Nom : Capture 2.PNG
Affichages : 757
Taille : 7,8 Ko

    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
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par arnadelf Voir le message
    Il serait assez judicieux de mettre votre code en ligne.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par arnadelf Voir le message
    D'où vient le tableau rouge ?

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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 :
    Nom : Capture1.PNG
Affichages : 762
Taille : 23,6 Ko
    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:
    Nom : Capture2.PNG
Affichages : 707
Taille : 6,0 Ko
    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
    Invité
    Invité(e)
    Par défaut
    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

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    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.

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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.

    Nom : 1.PNG
Affichages : 802
Taille : 206,0 Ko
    Nom : 2.PNG
Affichages : 761
Taille : 88,3 Ko

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

    Merci pour votre aide !

  16. #16
    Invité
    Invité(e)
    Par défaut
    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.

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par arnadelf Voir le message
    Le plus simple est de travailler avec le range des signets.

Discussions similaires

  1. [XL-2010] Probleme pour creer un tableau word depuis excel VBA
    Par amiralbhar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/02/2016, 20h54
  2. Macro Word depuis Excel avec tableau comme argument
    Par emorejbleu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/07/2013, 14h45
  3. [PPT-2003] Macro : copier coller graphiques/tableau Excel-Ppt
    Par gandalf20000000 dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 21/04/2010, 16h12
  4. mise en forme tableau word depuis excel
    Par cobol80 dans le forum VBA Word
    Réponses: 2
    Dernier message: 26/02/2008, 12h02
  5. coller une plage dans word depuis excel
    Par tarmin dans le forum VBA Word
    Réponses: 7
    Dernier message: 18/01/2006, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo