VBA Excel et Word - Ouverture d'un modèle

Bonjour,

J'ai un modèle Word (.dotx) que je souhaiterais ouvrir depuis une macro dans Excel. Actuellement ça fonctionne si j'ouvre le document Word (.docx) avec une macro (ci-dessous) faisant référence à des cellules spécifiques. Je que je souhaiterais c'est qu'un document Word (.docx) soit généré à partir de mon modèle Word (.dotx) tant qu'il y a des données dans Excel. Auriez-vous une idée ?

Sub ExcelVersWord()

Dim AppWord As Object
Dim Doc As Object
Dim i As Integer

'crée une instance de Word
Set AppWord = CreateObject("Word.Application")

With AppWord

.Visible = True

'ouvre un document, ATTENTION de mettre l'extension ".doc"
Set Doc = .Documents.Open("C:\XXX\XXX\Portefeuille clients\Lettres d'anniversaire\Anniversaires.docx")

With Doc

.Bookmarks("Titre_destinataire").Range.Text = Range("A2")
.Bookmarks("Nom").Range.Text = Range("C2") & " " & Range("B2")
.Bookmarks("Adresse").Range.Text = Range("D2")
.Bookmarks("Ville").Range.Text = Range("E2")

If Range("A2") = "Monsieur" Then
.Bookmarks("Titre_texte").Range.Text = "Cher " & Range("A2") & " " & Range("B2")
Else
.Bookmarks("Titre_texte").Range.Text = "Chère " & Range("A2") & " " & Range("B2")
End If
End With

End With

End Sub

Merci de votre précieuse aide et sincères salutations.

4 réponses

  1. Merci. Je vais tester et te reviens. Très appréciable. Bonne soirée
    1
    1. Re,

      Voici le principe avec une boucle (non testée faute de modèle) :
      Option Explicit
      Sub ExcelVersWord()
      Dim AppWord As Object
      Dim Doc As Object
      Dim rng As Range
        Set rng = Worksheets("Feuil1").Range("A2:E2")
        ' Crée une instance de Word
        Set AppWord = CreateObject("Word.Application")
        AppWord.Visible = True
        Do While rng(1, 1).Formula <> ""
          ' Ouvre un nouveau document non enregistré
          Set Doc = AppWord.Documents.Add("C:\XXX\XXX\Portefeuille clients\Lettres d'anniversaire\Anniversaires.dotx")
          With Doc
            .Bookmarks("Titre_destinataire").Range.Text = rng(1, 1).Value
            .Bookmarks("Nom").Range.Text = rng(1, 3).Value & " " & rng(1, 2).Value
            .Bookmarks("Adresse").Range.Text = rng(1, 4).Value
            .Bookmarks("Ville").Range.Text = rng(1, 5).Value
            If rng(1, 1).Value = "Monsieur" Then
              .Bookmarks("Titre_texte").Range.Text = "Cher " & rng(1, 1).Value & " " & rng(1, 2).Value
            Else
              .Bookmarks("Titre_texte").Range.Text = "Chère " & rng(1, 1).Value & " " & rng(1, 3).Value
            End If
          End With
          ' Ici il faudrait enregistrer et fermer le doc,
          ' c'est pas obligatoire pour les essais : les fichiers restent ouverts
          '  Doc.SaveAs nomCompletFichier
          '  Doc.Close
          Set rng = rng.Offset(1)  'ligne suivante
        Loop
      End Sub


      1
      1. Cher Patrice,

        Encore merci. Le point positif est que ça fonctionne. Le moins positif est que ça prend toutes les lignes (plus de 800). Ce que je souhaiterais c'est que ça prenne que les lignes affichées. En effet, le tableau montre les clients qui ont leur anniversaire aujourd'hui (date du jour). Dans le cas d'aujourd'hui, il y en avait 3 et j'aimerais que les données des cellules de ces trois clients soient insérées dans le document Word (3 fois uniquement).

        Bonne soirée et salutations.
        0
      2. @DavidRe,
        Option Explicit
        Sub ExcelVersWord()
        Dim AppWord As Object
        Dim Doc As Object
        Dim rng As Range
          Set rng = Worksheets("Feuil1").Range("A2:E2")
          ' Crée une instance de Word
          Set AppWord = CreateObject("Word.Application")
          AppWord.Visible = True
          Do While rng(1, 1).Formula <> ""
            If Not rng.EntireRow.Hidden Then
              ' Ouvre un nouveau document non enregistré
              Set Doc = AppWord.Documents.Add("C:\XXX\XXX\Portefeuille clients\Lettres d'anniversaire\Anniversaires.dotx")
              With Doc
                .Bookmarks("Titre_destinataire").Range.Text = rng(1, 1).Value
                .Bookmarks("Nom").Range.Text = rng(1, 3).Value & " " & rng(1, 2).Value
                .Bookmarks("Adresse").Range.Text = rng(1, 4).Value
                .Bookmarks("Ville").Range.Text = rng(1, 5).Value
                If rng(1, 1).Value = "Monsieur" Then
                  .Bookmarks("Titre_texte").Range.Text = "Cher " & rng(1, 1).Value & " " & rng(1, 2).Value
                Else
                  .Bookmarks("Titre_texte").Range.Text = "Chère " & rng(1, 1).Value & " " & rng(1, 3).Value
                End If
              End With
              ' Ici il faudrait enregistrer et fermer le doc,
              ' c'est pas obligatoire pour les essais : les fichiers restent ouverts
              '  Doc.SaveAs nomCompletFichier
              '  Doc.Close
            End If
            Set rng = rng.Offset(1)  'ligne suivante
          Loop
        End Sub
        0
      3. @Patrice33740MERCI !!!

        Tout fonctionne à la perfection.

        Très sympa de ta part. Salutations
        0
    2. Merci beaucoup. Ce qui est surprenant c'est que j'avais essayé avec .Add et j'avais un message d'erreur. J'ai très certainement dû oublié quelque chose.

      Salutations
      0
      1. Bonjour,

        Au lieu de Document.Open(Fichier) utiliser Document.Add(modèle)

        0
        1. Oserais-je abuser de ta gentillesse et connaissances ? Dans le code que je t'ai montré, je souhaiterais à présent générer une boucle pour que la macro ouvre un nombre de fichiers Word (.docx) en fonction du nombre de ligne visible. Je ne sais pas si je m'explique bien. Actuellement, les données inscrites dans le document Word sont définies manuellement par "range("A2"). J'aimerais que cette boucle fasse pareil mais depuis chaque ligne visible. 1 ligne = un document Word.

          Encore merci et belle soirée.
          0