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

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

Bonsoir Loulou,

Désolé mais je ne pourrais pas te répondre avant mercredi. Je ne suis pas chez moi.

A+

Martial
 

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
 

Yaloo

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

Bonsoir Loulou, le forum,

Où veux-tu mettre cette formule ? Dans quelle feuille ? Dans quelle cellule ?

A te relire

Martial
 

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
 

loulouange

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

alors je viens de regarder dans le code dans la feuille "fo reçues" je ne vois pas ou se trouve cette commande

Code:
Application.ScreanUpdating
?
 

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

génial c'est magique !!!

J'ai pas bien compris la formule mais je vais y regarder de plus près demain.

Encore merci pour tout.

A+

Loulou
 

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
 

loulouange

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

Bonjour Martial,

Juste pour te dire que j'ai revu le problème pour l'histoire de l'erreur#NA avec les mails, j'ai comparé les deux fois tout était pareil.

J'ai refait le test en remettant à neuf la formule qui se trouve dans la colonne "mail" de la feuille "BASE" (j'ai copier la première cellule et fait un copier coller vers la dernière cellule de la dernière ligne car il y avait le #NA sur certaines. Je l'avais déja fait la première fois mais le problème était toujours là. Et cette fois je ne sais pas pourquoi cela a résolue le problème :eek:

Bon ben j'espère que c'est bien réglé, désolée encore pour toutes mes questions, excel est parfois très capricieux ou je suis pas douée.

Bon et bien reste à trouver la solution pour mes formulaires, je continue mes recherches....

A te relire.

Loulou
 

Yaloo

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

Bonjour Loulou,

Problème de signet : fais un essai en mettant en début de macro On Error Resume Next cette ligne signifie que s'il y a une erreur on la traite après, ou pas :eek:. Il faut faire attention lorsque l'on utilise cette ligne, car ça peut partir dans tous les sens. Car quelque soit l'erreur elle ne sera pas gérée mais dans ton cas ça doit le faire ;).

Problème d'adresse Mail : Avec le code que je t'ai indiqué au post #191, il n'y a pas besoin de formule dans la feuille BASE.
Dans la première feuille, lorsque tu sélectionnes un RU l'adresse mail est complétée dans la colonne de droite et est mise à jour dans l'onglet BASE, donc il faut juste mettre les lignes de code que je t'ai mentionné au post #191 et c'est tout.

A te relire

Martial
 

loulouange

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

merci Martial pour ton retour rapide !

Ca y est j'ai compris ma grosse boulette !! :( Je m'étais bien embrouillée les pinçeaux au sujet du code pour les mails :
au départ j'avais bien compris que la formule n'était plus utile dans la feuille "Base" donc je l'avais supprimée, et j'avais ensuite rentré mes noms RU dans la feuille1 et comme je voyais le résultat instantanément je me suis dit super ça marche alors j'avais tout saisi d'un coup et quand j'ai rafraîchit la feuille plus rien ; alors du coup j'ai remis les formules dans base, bref je vais pas t’embêter avec tous les détails.

Mais j'ai enfin compris, je n'avais pas fait attention tout à l'heure en comparant les codes des fichiers et je me suis rendue compte que j'avais une différence :

Comme au début j'obtenais le résultat des mails graçe à la formule qui se trouvait dans BASE, j'avais modifié le code ainsi justement pour éviter que la formule ne soit écrasée pas la valeur rentrée dans la feuille1 (FO Reçues) :
Code:
 Sheets("Base").Cells(j, 2).Resize(, 12).Value = Cells(i, 2).Resize(, 12).Value
    Sheets("Base").Cells(j, 15).Resize(, 15).Value = Cells(i, 15).Resize(, 15).Value
Donc là je viens de le remettre comme c'était au départ et bien sur ça fonctionne !
Code:
Sheets("Base").Cells(j, 2).Resize(, 28).Value = Cells(i, 2).Resize(, 28).Value
Ceci explique cela, grrrr vraiment navrée de t'avoir fait perdre ton temps, j'ai honte :eek:

Pour l'histoire des formulaires ,je viens de tester et ça à l'air de fonctionner !! je n'ai pas eu de problème, je vais donc tout reprendre avec cette ligne, en espérant que tout sera enfin réglé.


Puis-je me permettre te demander un dernier conseil, je pense que mon fichier est enfin au point. A présent ce que je souhaiterais c'est de pouvoir faire une sauvegarde de mon classeur sans les macros ni codes etc... ceci au cas où cela planterait et puis pour rassurer mes collègues aussi ;).

J'ai trouvé ce code, je voulais être sure que cela était correct, je ne voudrais pas mettre la pagaille dans mon fichier actuel.

Apparemment il faut le mettre dans un module, donc je devrais passer par un bouton je suppose ?

Code:
Sub SupprimeToutVBA()
Dim VbComp As Object
ThisWorkbook.SaveAs "C:\copie Suivi Ateliers.xls"
For Each VbComp In ActiveWorkbook.VBProject.VBComponents ' 'suppression vba
Select Case VbComp.Type
Case 1 To 3
ActiveWorkbook.VBProject.VBComponents.Remove VbComp
Case Else
With VbComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
Next VbComp
 
ActiveWorkbook.Save ' enregistre les suppressions
 
End Sub
Le fichier sans macro reportera bien les valeurs ? j'espère que je n'aurais pas de cellule avec des erreurs car les formules n'y sont plus ?

Encore un grand merci à toi, et pour ta patience !!!

A te relire.

Loulou
 
Dernière édition:

Yaloo

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

Salut Loulou,

Ceci explique cela, grrrr vraiment navrée de t'avoir fait perdre ton temps, j'ai honte :eek:
Il ne faut surtout pas avoir honte, c'est en pratiquant que l'on arrive à progresser, ne t'inquiètes pas tout le monde est passé par des périodes d'erreur, de doute etc...

Puis-je me permettre te demander un dernier conseil, je pense que mon fichier est enfin au point.
Je pense que non, ton fichier n'est pas au point, car avec ce que tu as appris, tu vas le faire évoluer. Pour mes fichiers, souvent je les reprends, je me dis il faut rajouter ça ou ceci, les fichiers évoluent avec nos envies, nos besoins, l'important est que tu comprennes ton fichier de façon à le faire évoluer que tu le souhaites.

Apparemment il faut le mettre dans un module, donc je devrais passer par un bouton je suppose ?

Code:
Sub SupprimeToutVBA()
Dim VbComp As Object
ThisWorkbook.SaveAs "C:\copie Suivi Ateliers.xls"
For Each VbComp In ActiveWorkbook.VBProject.VBComponents ' 'suppression vba
Select Case VbComp.Type
Case 1 To 3
ActiveWorkbook.VBProject.VBComponents.Remove VbComp
Case Else
With VbComp.CodeModule
.DeleteLines 1, .CountOfLines
End With
End Select
Next VbComp
 
ActiveWorkbook.Save ' enregistre les suppressions
 
End Sub
Pourquoi ne pas l'enregistrer tout simplement au format .xlsx et non .xlsm, cela enregistre ton fichier sans les données VBA.

Le fichier sans macro reportera bien les valeurs ? j'espère que je n'aurais pas de cellule avec des erreurs car les formules n'y sont plus ?
En l'enregistrant au format .xlsx cela reprendra toutes tes valeurs sans la partie VBA.

Bonne journée

Martial
 

loulouange

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

Bonjour Martial, le forum,

Je trouve ce forum vraiment super, ça fait plaisir de tomber sur des personnes qui donnent de leur temps et avec qui on peut échanger et apprendre énormément.

Pour en revenir à mon fichier, quand je repense à ce qu'il était au départ et maintenant quelle transformation. Je sais qu'il sera amené à évoluer selon les besoins, j'ai appris beaucoup de choses que je pense pouvoir reproduire à présent. Je voulais dire qu'il paraissait au point par rapport aux bugs que je rencontrais, je pense qu'à présent il est fonctionnel.


En l'enregistrant au format .xlsx cela reprendra toutes tes valeurs sans la partie VBA.
Pourquoi faire compliquer quand on peut faire simple :D ah ben ta méthode de sauvegarde au format xlsx marche bien aussi je l'adopte ! +1

Mais alors quel est l'intérêt de cette macro ? c'est pour l'automatiser ?


J'ai encore une petite question :eek:, je vais utiliser mon fichier aussi comme base de données, donc lorsque j'ai voulu préparer la lettre type pour le publipostage j'ai eu des soucis pour que word reconnaisse les titres, c'est parce que dans mon fichier excel ils sont situés sur la deuxième ligne.

Donc les titres qui m'intéressent sont dans la feuille1 "fo reçus" : civilité, nom, prénom, adresse1..., j'ai tout remis sur la première ligne et pour une meilleure visibilité j'ai fusionné chaque cellule sur deux lignes par exemple le titre NOM "D1: D2".

A un moment dans l'un de tes posts (pas réusssi à le retrouver ils sont trop nombreux) tu m'avais conseillée de ne pas supprimer de ligne ou de faire de fusion, donc je voulais juste savoir si ça ne posait pas de problème ?

A te relire.

Loulou
 
Dernière édition:

Discussions similaires


Haut Bas