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

Fermé
David - 6 févr. 2021 à 12:40
 David - 7 févr. 2021 à 05:22
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.
A voir également:

4 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 6 févr. 2021 à 21:04
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
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779 > David
6 févr. 2021 à 22:55
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
David > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
7 févr. 2021 à 05:22
MERCI !!!

Tout fonctionne à la perfection.

Très sympa de ta part. Salutations
0
Merci. Je vais tester et te reviens. Très appréciable. Bonne soirée
1
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 6 févr. 2021 à 16:14
Bonjour,

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

0
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
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