Tableau Excel dans signet Word

Bonjour à tous,

je cherche à insérer un tableau Excel dans un signet Word.

A l'heure actuelle je suis capable de le faire de cette façon :

ThisWorkbook.Worksheets("Feuil1").activate
Range(A1:D10).Copy
appWord.Selection.Goto What:=wdGoToBookmark, Name:=signet
appWord.Selection.PasteSpecial

Le soucis est que cette méthode à tendance a poser des problèmes de presse-papiers (vide ou non valide) et est assez longue d’exécution lorsqu'on a beaucoup de tableaux à copier.

J'ai donc trouvé une autre instruction :

docWord.Bookmarks("signet").Range.Text = ThisWorkbook.Worksheets("Feuil1").Range("A1")

Petit problème : elle ne marche que dans le cas ou la plage spécifiée ne correspond qu'à une seule cellule.

En effet si j'écris :

docWord.Bookmarks("signet").Range.Text = ThisWorkbook.Worksheets("Feuil1").Range("A1:D10")

j'ai une incompatibilité de type.

J'aimerais donc trouver une instruction du type

docWord.Bookmarks("signet").Range.Table = ThisWorkbook.Worksheets("Feuil1").Range("A1:D10")

Merci pour votre aide !

Bonjour,

Le plus propre est de créer le tableau dans word depuis excel et de le remplir avec le contenu de cellules d'excel.

Voir dans l'exemple joint, le code est commenté pour diverses opérations dont la création et le remplissage d'un tableau dans word.

Bon dimanche

Pierre

317creer-doc-word.xlsm (37.05 Ko)

bonjor

salut au passage pierrep

pourquoi pas dans Word faire "insérer objet" ?

Bonjour,

Le plus propre est de créer le tableau dans word depuis excel et de le remplir avec le contenu de cellules d'excel.

Voir dans l'exemple joint, le code est commenté pour diverses opérations dont la création et le remplissage d'un tableau dans word.

Bon dimanche

Pierre

Bonjour Pierre,

merci pour votre réponse !

Il y a beaucoup de choses très utiles dans votre fichier, merci de me l'avoir partagé.

Malheureusement je ne l'avais pas précisé mais je passe en fait par une boucle pour copier mes tableaux, qui sont presque tous différents, et avec cette méthode très précise j'ai l'impression qu'il faut les traiter au cas par cas ?

bonjor

salut au passage pierrep

pourquoi pas dans Word faire "insérer objet" ?

Bonjour jmd,

merci pour votre réponse !

"Insérer objet" me conviendrait parfaitement pour une utilisation peu fréquente.

Mais comme j'ai un grand nombre de tableaux à importer, et que je serais amener à refaire cette action un grand nombre de fois, je cherche à automatiser tout ça.

Mais peut être qu'utiliser l'enregistreur de macros pour en connaître le code serait utile ? qu'en pensez-vous ?

Malheureusement je ne l'avais pas précisé mais je passe en fait par une boucle pour copier mes tableaux, qui sont presque tous différents, et avec cette méthode très précise j'ai l'impression qu'il faut les traiter au cas par cas ?

N'importe quel tableau c'est un nombre donné de colonnes et un nombre donné de lignes d'une plage quelconque.

A partir de ce principe, c'est simple de factoriser, par exemple avec un code générique du genre :

Sub Copie_tblo_dans_word(Wd As Object, Plage As Range)
Dim lg As Integer, cl As Integer, i As Integer, j As Integer

    lg = Plage.Rows.Count
    cl = Plage.Columns.Count
    With Wd.Tables.Add(Range:=Rng, NumRows:=lg, NumColumns:=cl)
         For i = 1 To lg
            For j = 1 To cl
                With .cell(i, j)
                    .Range.Text = Plage(i, j).Value
                    .Borders.Enable = True
                    .Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
                End With
            Next j
        Next i
    End With
End Sub

Ce code copie n'importe quelle plage d'excel, l'appel se faisant comme suit:

    With WordDoc
        ' ...
        .Paragraphs.Add
        Copie_tblo_dans_word WordDoc, ActiveSheet.Range("A1:H6")
        .Paragraphs.Add
        Copie_tblo_dans_word WordDoc, Sheets("Bilan").Range("K10:M12")
        ' etc ...
    End With

Après on peut peaufiner facilement en gardant le même principe.

Facile, non?

@pierrep56

Effectivement c'est bien pensé ! merci pour ton aide.

Je vais essayer d'appliquer tout ça.

Et au niveau du temps d'exécution ça donne quoi ?

Autre petite question : la taille du tableau s'ajuste automatiquement à la page word ?

Alors pour les largeurs des colonnes, c'est aussi très simple.

On déclare une variable publique genre :

Public Lrg As Variant

Au début de la procédure d'export vers word, on initialise cette variable en array d'array contenant les largeurs souhaitées des différents tableau de word, du genre (ici pour 2 tableaux, index 0 et index 1):

Lrg = Array(Array(1.8, 2.6, 6, 3, 4.5), Array(1.1, 1.2, 1.3))

Il suffit alors de passer l'index du tableau à la procédure d'export de tableau :

    Lrg = Array(Array(1.8, 2.6, 6, 3, 4.5), Array(1.1, 1.2, 1.3))

    With WordDoc
        ' ...
        Copie_tblo_dans_word WordDoc, WordApp, ActiveSheet.Range("A1:H6"), 0
        .Paragraphs.Add
        Copie_tblo_dans_word WordDoc, WordApp, Sheets("Bilan").Range("K10:M12"), 1
        ' etc ...
    End With

Et on récupère cet index pour fixer les largeurs de chaque colonne :

Sub Copie_tblo_dans_word(Wd As Object, Wa As Object, Plage As Range, Idx As Integer)
Dim lg As Integer, cl As Integer, i As Integer, j As Integer

    lg = Plage.Rows.Count
    cl = Plage.Columns.Count
    With Wd.Tables.Add(Range:=Rng, NumRows:=lg, NumColumns:=cl)
        For j = 1 To cl
            .Columns.Item(j).Width = Wa.CentimetersToPoints(Lrg(Idx)(j - 1))
        Next j

        For i = 1 To lg
            For j = 1 To cl
                With .cell(i, j)
                    .Range.Text = Plage(i, j).Value
                    .Borders.Enable = True
                    .Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
                End With
            Next j
        Next i
    End With
End Sub

Sur le même principe si on veut, on peut aussi fixer un alignement personnalisé pour chaque colonne de chaque tableau, par exemple => .Range.ParagraphFormat.Alignment = Align(Idx)(j - 1)

Align étant un array d'array comme Lrg et contenant des valeurs de 0 à 3 (ghe, dte, centré, justifié)

Et si on structure Align comme Lrg, l'index reste le même pour les 2.

Trop bien, non?

Bonjour à tous,

Pour ce matin, voici une démo dans laquelle il y a une procédure fonctionnelle (et optimisée) de copie de plage(s) Excel vers tableau(x) Word.

L'appel est simplifié => Copie_tblo_dans_word Plage, index, Titre_éventuel

* La Plage c'est la zone à copier

* L'index c'est l'index des tableaux des largeurs des colonnes et du tableau des alignements des cellules

* Le Titre_éventuel c'est un argument optionnel pour ajouter une première ligne de titre

A noter : cette procédure récupère le format de chaque cellule Excel pour l'appliquer dans le doc à l'identique

(ça fonctionne pour les formats textes, général, date, numérique, monétaire)

L'appel pourrait être facilement être placé dans une boucle pour plusieurs tableaux si besoin.

Pierre

@pierrep56

Super merci pour toutes ces explications !

Rechercher des sujets similaires à "tableau signet word"