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

David -  
 David -
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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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. David
       
      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
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > David
         
        Re,
        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
      2. David > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
         
        MERCI !!!

        Tout fonctionne à la perfection.

        Très sympa de ta part. Salutations
        0
  2. David
     
    Merci. Je vais tester et te reviens. Très appréciable. Bonne soirée
    1
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

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

    0
    1. David
       
      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
  4. David
     
    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