Générer des courriers types word à partir d'excel

loulouange

XLDnaute Occasionnel
Bonsoir,

Je me permets de faire appel à vos compétences en Excel afin de savoir s'il est possible de créer dans un tableau excel comprenant une liste de personnes avec coordonnées, un bouton ou autre permettant d'ouvrir un document spécifique dans Word reprenant des éléments dans le tableau excel.

Etant donné que se sont des lettres personnalisées, il n'y pas de possibilité de faire un publipostage.

Jusqu'ici je n'ai pu qu'améliorer les lettres types en appliquant des champs, (je n'y connaissais rien avant).

Je sais qu'Excel propose de grandes possibilités mais je crains que ce que je demande nécessite une très bonne maîtrise d'Excel.

Ceci dit, si vous pensez que ma demande est réalisable, et s'il existe un tuto pas à pas ou si vous pouviez m'expliquer au moins pour un exemple, je pourrais tenter de comprendre le fonctionnement des macros.

Pour vous permettre de mieux cerner ma demande, je vous mets en pièce jointe un tableau et deux exemples de lettres types, une pour absence injustifiée (AI) et l'autre pour absence justifiée (AJ).

Le tableau est exhaustif, d'autres lettres types et documents existent, le but étant de pouvoir en cliquant sur un bouton (dans chaque colonne sur chaque ligne ??) de générer le document et de reprendre l'adresse du destinataire.

Je vous remercie par avance pour vos suggestions et conseils qui me seront bien précieux.
 

Pièces jointes

  • données sources.xls
    29.5 KB · Affichages: 247
  • Convov2 suite à AJ avec rdv ateliers.docx
    152 KB · Affichages: 230
  • Convov2 suite à AI avec rdv ateliers.docx
    154.9 KB · Affichages: 171
  • Convov2 suite à AJ avec rdv ateliers.docx
    152 KB · Affichages: 225
  • Convov2 suite à AI avec rdv ateliers.docx
    154.9 KB · Affichages: 179
  • Convov2 suite à AJ avec rdv ateliers.docx
    152 KB · Affichages: 225
  • Convov2 suite à AI avec rdv ateliers.docx
    154.9 KB · Affichages: 179

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonsoir Loulou,

Tu peux le faire en remplaçant les dernières lignes de ta macro (Activate) par celles ci-dessous à partir du tri.
VB:
'On trie par rapport au Nom puis Prénom
Range("A3:AC" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
  [AD3].FormulaR1C1 = "=IF(RC[-2]="""","""",IF(SUMPRODUCT((R3C4:RC4=RC4)*(R3C5:RC5=RC5)*(R3C28:RC28=""X""))>1,""1"",""""))"
  [AD3].AutoFill Destination:=[AD3:AE3], Type:=xlFillDefault
  [AD3:AE3].AutoFill Destination:=Range("AD3:AE" & [A65536].End(3).Row), Type:=xlFillDefault
With Application
  .DisplayAlerts = -1
  .EnableEvents = -1
  .Calculate
End With

A+

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial,

Génial ça fonctionne à la perfection !! Je n'aurais jamais trouvé c'est certain.

Du coup j'ai voulu essayer en adaptant une autre formule en vba, mais je m'arrache les cheveux depuis hier :(

Peux tu me dire si je suis partie sur la bonne piste ?

La formule classique :

Dans la cellule N3
Code:
=SI(ESTVIDE(M3);"";INDEX('Menus Déroulants'!$K$3:$K$300;EQUIV(M3;'Menus Déroulants'!$J$3:$J$300;0)))

Voici mon essai en VBA
Code:
 If Cells(i, 13) <> "" Then
    Cells(i, 14)= Application.Index(Sheets("Menus Déroulants").Range("K3:K300"), Application.Match(Cells(i, 13), Application.Match(Sheets("Menus Déroulants").Range("J3:J300"), 0))
    Else
      Cells(i, 14) = ""
      End If
            End If

J'ai le message suivant : Erreur de syntaxe - compilation

En espérant ne pas m'être complètement plantée, je te remercie par avance pour ton aide.

A te relire.

Loulou
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Re,

J'ai réussi à me connecter avec un PC comportant Excel, en utilisant l'enregistreur de macro, j'obtiens ça :

Code:
Sub Macro1()
' Macro1 Macro
    ActiveCell.FormulaR1C1 = _
        "=IF(ISBLANK(R[2]C[12]),"""",INDEX('Menus Déroulants'!R3C11:R300C11,MATCH(R[2]C[12],'Menus Déroulants'!R3C10:R300C10,0)))"
    Range("A1").Select
End Sub

Est-ce que ça te convient ?

A+

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonsoir Martial, le forum,

Désolée de n'être pas revenue plus tôt

c'est vraiment sympa à toi d'avoir répondu aussi vite, je me suis empressée d'essayer ton code mais je ne sais pas si je l'ai mis au bon endroit, car ça n'a pas l'air de fonctionné, je ne vois aucun changement.

Je l'ai inséré vers la fin du code de la feuille1 là où doit se trouver le résultat, juste au dessus de :

Code:
Sub Relance()
Application.DisplayAlerts = -1: Application.EnableEvents = -1
End Sub

A te relire.

Loulou
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

je te remets ici le lien du fichier

suivi-ateliers-martial.xlsm - Fichier XLS

dans la feuille1 "fo reçues" dans la colonne M qui correspond à "NOM", elle contient une liste déroulante dont les valeurs sont inscrites dans la feuille "menus déroulants" dans la colonne J.

Je voudrais que lorsque je choisis le nom dans la liste déroulante, l'adresse mail s'affiche automatiquement dans la colonne N de la feuille1. les adresses mails sont elles situées dans la colonnes K de la feuille "menus déroulants".

Actuellement j'ai mis une formule classique "matricielle" je crois ? et je l'ai placé en fait dans la dernière feuille base pour éviter qu'elle ne saute mais ce n'est pas toujours fiable.

J'espère que ce n'est pas trop confu.

A te relire.

Loulou
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Re,

Personnellement, je ne mettrai pas une formule mais plutôt incorporer la recherche dans la macro.
Bout de code à mettre à la fin de la macro Change() de la feuille "fo reçues" juste entre Application.ScreanUpdating .... et End Sub

VB:
Application.DisplayAlerts = -1: Application.EnableEvents = -1
If Target.Column = 13 Then
  If Target <> "" Then
    If Not IsError(Application.Match(Target, Feuil5.Columns(10), 0)) Then
      Target.Offset(, 1) = Feuil5.Cells(Application.Match(Target, Feuil5.Columns(10), 0), 11)
    End If
  End If
End If
End Sub

En mettant ce bout de code juste après Application.ScreanUpdating .... cela permet d'insérer l'adresse mail dans la feuille "Base".

A te relire

Martial
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Re,

Désolé, je voulais dire entre Application.DisplayAlerts .... et End Sub

VB:
Application.DisplayAlerts = -1: Application.EnableEvents = -1
If Target.Column = 13 Then
   If Target <> "" Then
     If Not IsError(Application.Match(Target, Feuil5.Columns(10), 0)) Then
       Target.Offset(, 1) = Feuil5.Cells(Application.Match(Target, Feuil5.Columns(10), 0), 11)
     End If
   End If
End If
End Sub

A+

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial, le forum,

J'ai fait des essais au bureau mais j'ai encore quelques soucis :( désolée.

Ton code fonctionne très bien, mais si je rajoute dans la feuille "menus déroulants" un nouveau nom avec son adresse mail, quand je le sélectionne dans la feuille1 "FO reçues", je vois bien instantanément dans la cellule "mail" le résultat mais lorsque je raffraichi la feuille il disparaît et j'ai à la place "#N/A".

Pour ton cote, je te mets ce que ça donne à la fin :

Code:
Range("A3:AG" & [A65536].End(xlUp).Row).Sort [D3], xlAscending, [E3], , xlAscending, , , xlNo
Application.DisplayAlerts = -1: Application.EnableEvents = -1
Application.DisplayAlerts = -1: Application.EnableEvents = -1
If Target.Column = 13 Then
   If Target <> "" Then
     If Not IsError(Application.Match(Target, Feuil5.Columns(10), 0)) Then
       Target.Offset(, 1) = Feuil5.Cells(Application.Match(Target, Feuil5.Columns(10), 0), 11)
     End If
   End If
End If
End Sub

Est ce normal que la ligne Application.DisplayAlerts soit écrite deux fois ?


J'ai un autre problème avec les formulaires mais je préfère t'en parler plus tard.

Merci à toi pour ton aide.

A te relire.

Loulou
 

Yaloo

XLDnaute Barbatruc
Re : Générer des courriers types word à partir d'excel

Bonjour Loulou, le forum,

La ligne Application.Display .... n'a pas d'influence, une seule fois est suffisante, mais le fait que ce soit écrit 2 fois n'a pas d'importance.

Je n'ai pas réussi à reproduire ton erreur, comment fais-tu exactement ?

J'ai bien rajouté un RU dans "Menus déroulants", mais je n'ai toujours pas d'erreur.

A te relire

Martial
 

loulouange

XLDnaute Occasionnel
Re : Générer des courriers types word à partir d'excel

Bonjour Martial, le forum,

Alors j'ai fait un essai avec le fichier que je t'avais envoyé et là ça fonctionne, par contre avec le mien (celui avec les noms etc..) ça me donne cette erreur, je vais comparer les codes de la feuille1 des deux fichiers pour voir si je vois quelque chose.

J'en profite pour te parler de mon second problème concernant les formulaires. Mon code actuel est le suivant :

Code:
With oDoc
      'Ta boucle te permettant de copier tes valeurs de la ListBox (colonne de C à O)
     'dans tes signets de 1 à 13
     For i = 1 To 12
        'Le signet prend la valeur de la colonne, on fonction de i
       .Bookmarks("Signet" & i).Range = ListBox1.Column(i - 1)
      Next
      'Puis
     .Bookmarks("Signet13").Range = Format(DateValue(ListBox1.Column(12)), "dd/mm/yy")
     .Bookmarks("Signet14").Range = Format(DateValue(ListBox1.Column(14)), "dd/mm/yy")
     .Bookmarks("Signet15").Range = Format(DateValue(ListBox1.Column(15)), "dd/mm/yy")
     .Bookmarks("Signet16").Range = Format(DateValue(ListBox1.Column(16)), "dd/mm/yy")
     .Bookmarks("Signet17").Range = Format(DateValue(ListBox1.Column(18)), "dd/mm/yy")
     .Bookmarks("Signet18").Range = Format(DateValue(ListBox1.Column(20)), "dd/mm/yy")
End With
'On rend Word visible
oWord.Visible = True

End Sub

Le soucis c'est que si une des cellules est vides tout plante, le fichier word ne s'ouvre pas, le fichier excel est aussi inaccessible, du coup je suis obligée de faire dans un premier temps un CTRL ALT SUPP pour fermer les fichier word en cours, mais ça ne fonctionne pas toujours donc je dois fermer tous les fichiers voire redémarrer.

Je précise que les signets de 1 à 12 même si cellule vide fonctionne mais j'ai l'impression que ça concerne celles où est précisé le format date c'est à dire signets 13 à 18.

Donc j'ai repris le code pour ne plus avoir d'erreur mais je pense que ça ne va pas car du coup certaines cellules meme si renseignées ne sont pas répercutées, je pense que c'est une histoire avec les"End if"

Code:
With oDoc
      'Ta boucle te permettant de copier tes valeurs de la ListBox (colonne de C à O)
     'dans tes signets de 1 à 13
     For i = 1 To 12
        'Le signet prend la valeur de la colonne, on fonction de i
       .Bookmarks("Signet" & i).Range = ListBox1.Column(i - 1)
      Next
      'Puis
       If Cells(i, 15) <> "" Then
      .Bookmarks("Signet13").Range = Format(DateValue(ListBox1.Column(12)), "dd/mm/yy")
      Else
.Bookmarks("Signet13").Range = ""
End If
      If Cells(i, 17) <> "" Then
   .Bookmarks("Signet14").Range = Format(DateValue(ListBox1.Column(14)), "dd/mm/yy")
    Else
    .Bookmarks("Signet14").Range = ""
End If
   If Cells(i, 18) <> "" Then
   .Bookmarks("Signet15").Range = Format(DateValue(ListBox1.Column(15)), "dd/mm/yy")
Else
.Bookmarks("Signet15").Range = ""
End If
     If Cells(i, 19) <> "" Then
 .Bookmarks("Signet16").Range = Format(DateValue(ListBox1.Column(16)), "dd/mm/yy")
Else
.Bookmarks("Signet16").Range = ""
End If
      If Cells(i, 21) <> "" Then
 .Bookmarks("Signet17").Range = Format(DateValue(ListBox1.Column(18)), "dd/mm/yy")
Else
.Bookmarks("Signet17").Range = ""
End If
If Cells(i, 23) <> "" Then
     .Bookmarks("Signet18").Range = Format(DateValue(ListBox1.Column(20)), "dd/mm/yy")
Else
.Bookmarks("Signet18").Range = ""
End If
End With
'On rend Word visible
oWord.Visible = True
End Sub
'Idem que la macro ci-dessus, on change juste le nom du fichier

Private Sub CommandButton2_Click()
Dim oWord As Object
Dim oDoc As Object
Dim i&
'Si aucune ligne de la ListBox1 n'est sélectionnée alors on a un message puis on sort
If ListBox1.ListIndex = -1 Then MsgBox "Il faut sélectionner une personne": Exit Sub
'On ferme l'UserForm1
Unload Me
  'Détermine l'Objet oWord qui sera l'application
  Set oWord = CreateObject("Word.Application")
  'Détermine l'Objet oDoc qui sera le document Word de l'application oWord
  'On en profite pour l'ouvrir en même temps
  'Il faut mettre le chemin d'accès et le nom du fichier avec son extension
  'Le chemin d'accès, dans ce cas-là, est le même que celui de ce fichier Excel
  Set oDoc = oWord.Documents.Open("C:\RESURGENCES 2013\CONSEIL GENERAL\AME - 13C0380\SUIVI Montpellier&Pignan\MATRICES USEFORM\SIRSA Montpellier\Fiches non entrée\Fiche non entree ADS Ecusson Coeur de Ville.docx")
  'Avec ce document
   With oDoc
      'Ta boucle te permettant de copier tes valeurs de la ListBox (colonne de C à O)
     'dans tes signets de 1 à 13
     For i = 1 To 12
        'Le signet prend la valeur de la colonne, on fonction de i
       .Bookmarks("Signet" & i).Range = ListBox1.Column(i - 1)
      Next
      'Puis
     .Bookmarks("Signet13").Range = Format(DateValue(ListBox1.Column(12)), "dd/mm/yy")
    If Cells(i, 17) <> "" Then
   .Bookmarks("Signet14").Range = Format(DateValue(ListBox1.Column(14)), "dd/mm/yy")
Else
.Bookmarks("Signet14").Range = ""
End If
 If Cells(i, 18) <> "" Then
  .Bookmarks("Signet15").Range = Format(DateValue(ListBox1.Column(15)), "dd/mm/yy")
Else
.Bookmarks("Signet15").Range = ""
End If
     If Cells(i, 19) <> "" Then
 .Bookmarks("Signet16").Range = Format(DateValue(ListBox1.Column(16)), "dd/mm/yy")
Else
.Bookmarks("Signet16").Range = ""
End If
      If Cells(i, 21) <> "" Then
 .Bookmarks("Signet17").Range = Format(DateValue(ListBox1.Column(18)), "dd/mm/yy")
Else
.Bookmarks("Signet17").Range = ""
End If
If Cells(i, 23) <> "" Then
     .Bookmarks("Signet18").Range = Format(DateValue(ListBox1.Column(20)), "dd/mm/yy")
Else
.Bookmarks("Signet18").Range = ""
End If
End With
'On rend Word visible
oWord.Visible = True
End Sub

a te relire

Loulou
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 097
Messages
2 116 186
Membres
112 679
dernier inscrit
Yupanki