Excel / Word Signet

Bonjour à tous,

Dans le cadre de mon travail, je dois remplir un fichier word à l'aide d'informations qui se trouvent dans un fichier excel.

J'aimerai trouver un moyen que les informations se remplissent automatiquement et j'ai cru comprendre que c'est par l’intermédiaire d'une macro excel ainsi que de signets que cela est possible.

J'ai trouvé sur internet la macro suivante :

Sub Publicontract()
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim i As Byte
Set WordApp = CreateObject("word.application")
Set WordDoc = WordApp.Documents.Open("C:\essaie1.docx")
WordApp.Visible = True
For i = 4 To 7
Set monSignet = WordDoc.Bookmarks("Signet" & i).Range
monSignet.Text = Cells(i, 2)
WordDoc.Bookmarks.Add "Signet" & i, monSignet
Next i
End Sub

Mais j'avoue ne pas bien comprendre comment elle fonctionne.

Je vais essayer de m'expliquer à travers un exemple :

En colonne B j'ai le nom des signets 'date, destination, prix)

En colonne C j'ai l’information que j’aimerais envoyer automatiquement comme suit :

Date 12/10/20

Destination Tunisie

Prix 799e

Comment faire pour que le signet "Date" se remplisse automatiquement dans mon word avec l'information "12/10/2020" ?

J'espère avoir été clair dans ma demande et je vous remercie par avance

Bonjour,

si l'information Date est sur la ligne 4,

If i = 4 then monSignet.Text = Format(Cells(i, 2), "dd/mm/yy") else monSignet.Text = Cells(i, 2)

Bonjour,

Merci pour l'élément de réponse.

Donc si je comprends bien, avec votre ligne de VBA, l'information de la date en cellule C4 ira directement sur le signet "Date" de mon word ?

Et pour insérer plus de signet il me suffit de dupliquer la ligne de code comme suit ?

If i = 4 then monSignet.Text = Format(Cells(i, 2), "dd/mm/yy") else monSignet.Text = Cells(i, 2)

If i = 5 then monSignet.Text = Cells(i, 2) --> information de la destiantion en cellule C5

If i = 6 then monSignet.Text = Cells(i, 2) --> information du prix en cellule C6

etc etc

Merci !

c'en en remplacement de la ligne

monSignet.Text = Cells(i, 2)

par

If i = 4 Then monSignet.Text = Format(Cells(i, 2), "dd/mm/yy") Else monSignet.Text = Cells(i, 2)

Bonjour,

Pour remplir un document Word à partir d'un classeur Excel, plutôt que des signets, il est préférable d'utiliser des contrôles de contenu de texte : Word --> menu développeur --> Contrôles --> Bouton "Aa".

Les propriétés de ce contrôle comportent un titre et une balise. Il suffit alors d'y affecter les noms de votre colonne B.

ci-joint exemple de document Word avec les contrôles correspondant aux noms de votre colonne B.

ci-dessous exemple de code en supposant que le document Word soit placé dans votre dossier : Mes Documents

Sub remplissage_doc()

    Dim WordApp As Object, WordDoc As Object, ctrl As Object
    Dim nom_fichier As String

    Set WordApp = CreateObject("word.application")
    WordApp.Visible = True
    nom_fichier = CreateObject("Wscript.Shell").SpecialFolders("MyDocuments") & "\essai01.docx"
    Set WordDoc = WordApp.Documents.Open(nom_fichier)

    For Each ctrl In WordDoc.ContentControls
        If ctrl.Type = 0 Then
            Set Cell = ActiveSheet.Columns("B").Find(ctrl.Tag)
            If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(, 1)
        End If
    Next ctrl

    MsgBox "fin du traitement"

    WordDoc.Close savechanges:=True
    WordApp.Quit
End Sub

Remarque : ctrl.Tag est la balise du contrôle, ctrl.Title est son titre.

112essai01.docx (17.41 Ko)

Bonjour Thev,

Merci beaucoup pour votre réponse.

N'ayant q'un mac chez moi je ne peux pas tester la macro ce week-end mais ce sera ma priorité du Lundi.

Si je peux encore abuser de vos connaissances, j'ai encore quelques questions sur ce sujet :

  • Si je connais le chemin d'accès précis de mon document Word, peut-on le rentrer directement dans la macro ? car j'ai ici l'impression que l'on crée un nouveau fichier word à chaque fois ?
  • Avec la macro qe vous m'avez donné, je peux rajouter autant de controle sur la colonne B (avec les informations correspondantes en colonne C) et en rajoutant des boutons Aa sur le document Word, ceux-ci se rempliront automatiquement ?

C'est génial en tout les cas merci beaucoup !

Si je connais le chemin d'accès précis de mon document Word, peut-on le rentrer directement dans la macro ?

Oui. Mais il est toujours préférable de le placer dans les dossiers standard Microsoft : mes Documents ou Bureau dont le chemin est donné par : CreateObject("Wscript.Shell").SpecialFolders("MyDocuments") ou CreateObject("Wscript.Shell")SpecialFolders("Desktop")

car j'ai ici l'impression que l'on crée un nouveau fichier word à chaque fois ?

Pas du tout. On met simplement à jour le fichier Word avec les infos issues du fichier Excel. On recrée seulement à chaque fois une application Word, qui est fermée à la fin de la procédure : "WordApp.Quit"

Avec la macro qe vous m'avez donné, je peux rajouter autant de controle sur la colonne B (avec les informations correspondantes en colonne C) et en rajoutant des boutons Aa sur le document Word, ceux-ci se rempliront automatiquement ?

Oui, sous réserve de renseigner titre et balise des contrôles "Aa" avec les noms de la colonne B, en cliquant sur leurs propriétés (Menu Développeur --> Contrôles --> Propriétés)

Bonjour,

C'est parfait ! je viens de tester et tout fonctionne correctement.

J'ai également trouvé un subsitut :

Sub maj()

Dim AppWord As Object

Dim Doc As Object

Set AppWord = CreateObject("Word.Application")

With AppWord

.Visible = True

Set Doc = .documents.Open("\\Sw-frathc-fil01\users-fr$\T1102007\Desktop\ExcelWord\Doc1.docx")

With Doc

.bookmarks("Monsignet1").Range.Text = Range("A1")

.bookmarks("Monsignet3").Range.Text = Range("A2")

End With

End With

End Sub

Ma dernière question est la suivante : Peut-on ajouter une ligne qui change la couleur du mot que j'ajoute ?

Merci par avance pour vos idées !

Ma dernière question est la suivante : Peut-on ajouter une ligne qui change la couleur du mot que j'ajoute ?

Bien sûr, ci-dessous code modifié

   
    For Each ctrl In WordDoc.ContentControls
        If ctrl.Type = 0 Then
            Set Cell = ActiveSheet.Columns("B").Find(ctrl.Tag)
            If Not Cell Is Nothing Then
                ctrl.Range.Text = Cell.Offset(, 1)
                ctrl.Range.Font.ColorIndex = 2 'couleur bleue
            End If
        End If
    Next ctrl
    

et lien des codes couleur : https://docs.microsoft.com/en-us/office/vba/api/word.wdcolorindex

Bonjour Thev,

Merci pour votre réactivité.

Votre macro marche parfaitement.

Est-il néanmoins possible de choisir la couleur selon le Contrôle ?

Par exemple, ma contrôle "Destination" en rouge et le contrôle "Prix" en bleu?

Car si je comprends bien, la dernière ligne de code que vous m'avez donné applique une couleur pour tous les controles ?

J'ai contourné ce problème en répétant la boucle de Crtl tag sur la colonne E. C'est-à-dire que tous les controle en colonne B sont de couleur Bleue et ceux en colonne "E" sont en vert.

Cela donne comme suit :

For Each ctrl In WordDoc.ContentControls

If ctrl.Type = 0 Then

Set Cell = ActiveSheet.Columns("B").Find(ctrl.Tag)

If Not Cell Is Nothing Then

ctrl.Range.Text = Cell.Offset(, 1)

ctrl.Range.Font.ColorIndex = 2 'couleur bleue

End If

End If

Next ctrl

For Each ctrl In WordDoc.ContentControls

If ctrl.Type = 0 Then

Set Cell = ActiveSheet.Columns("E").Find(ctrl.Tag)

If Not Cell Is Nothing Then

ctrl.Range.Text = Cell.Offset(, 1)

ctrl.Range.Font.ColorIndex = 4

End If

End If

Next ctrl

Je ne pense pas que ce soit très optimisé mais cela semble fonctionner.

Merci pour aide précieuse.

Est-il néanmoins possible de choisir la couleur selon le Contrôle ?

Dans ce cas, le plus simple est d'affecter directement la couleur au contrôle de contenu dans le document Word, en sélectionnant le remplissage de base.

ci-joint exemple:

36essai01.docx (17.51 Ko)

Ça marche parfaitement. Merci pour votre aide cela va me faciliter la tâche sur beaucoup de tâches répétitives.

Bonne fin de journée

Rechercher des sujets similaires à "word signet"