Générer Word d'après Excel
Bonjour à toutes et tous,
Je suis nouveau dans ce forum et nouveau dans l'utilisation de VBA sur Excel. Et j'ai besoin d'aide.
Je m'occupe de la trésorerie d'une petite association, je tiens un tableur avec les cotisations des adhérents et je voudrais générer une attestation pour chaque adhérent. J'ai épluché un certain nombre de posts de ce merveilleux site, mais je n'ai pas trouvé de solution qui résolve mon problème.
Voici ce que je voudrais pouvoir faire :
Sur Excel, la colonne "A" contient la civilité des adhérents (Mr ou Mme), sur la colonne "B" le prénom, sur la colonne "C" le nom, sur la colonne "R" la somme versée. Le nom de la feuille est l'année (2022 par exemple).
Je souhaiterais obtenir une trame qui génère, à la demande, un fichier Word avec ces renseignements contenus dans le fichier Excel. J'ai essayé avec des signets et avec des boutons de commande, comme conseillé dans certains posts. Mais rien ne marche.
Merci beaucoup de votre aide.
Bonjour hadaga et
Une petite présentation ICI serait la bienvenue
Si vous ne l'avez pas encore fait, je vous invite à lire :
- La charte du forum
- Quelques fonctionnalités du forum à connaître
Regardez aussi les petites icônes mises à votre disposition dans la barre de menu qui :
- vous permettent de poster un code (</>)
- ou de clôturer un fil lorsque vous avez terminé (V)
Concernant votre demande, surtout quand on débute en VBA,
je pense que le mieux est de créer directement un formulaire sur une feuille Excel que l'on peut remplir avec des RECHERCHEV()
Merci pour votre participation
Cordialement
Bonsoir, j'ai bricolé un petit quelque chose.
L'idée est d'avoir une feuille modèle (onglet courrier), et un onglet "données" (2022).
Dans l'onglet 2022, tu sélectionne le ou les noms pour lesquels tu veux créer un courrier, et tu lance la macro
Elle génère un fichier PDF pour chaque nom sélectionné.
A adapter à ton besoin ....
Bonsoir,
j'ai eu à gérer des listes entière de personnels, et "au début" je faisais comme vous une colonne pour chaque particules du personnel. Mais j'ai arrêté afin d'avoir moins de risque de doublon. Le suivi était fait avec Nom Prénom. Bon ça c'est juste une indication au passage.
La suite de ma demande est ici: pourquoi passer par Word ? Excel peut très bien faire des impressions et du coup on en arrive à ce que dit BrunoM45 :
une feuille Excel structuré pour afficher le texte "commun" à tous avec des "trous" cellules connues et fixes qui comporteront des formules allant chercher les données en fonction d'une autre cellule qui elle serait une liste de choix afin de choisir à qui l'on veut écrire.
Si à chaque fois c'est à la totalité du groupe qu'il faut éditer le document, alors VBA sera là pour automatiser cette opération.
Une dernière chose : je crois bien que Mr est l'abréviation en anglais de Mister, en français je crois que c'est le M.
Un fichier exemple :
@ bientôt
LouReeD
Bonjour à toues et tous,
Je vous remercie tous pour vos réponses. Je ne m'attendais pas à avoir de l'aide si vite !
Je suis au travail pour le moment. Je regarderai tout ça quand j'aurai un petit moment.
A plus tard.
Merci.
Bonsoir à toutes et tous,
Grand merci à ZeChris, LouReeD et BrunoM45 pour les solutions que vous m'avez proposées.
Je n'ai pas encore pu les tester sur tous les cas de figure que je rencontre, mais a priori cela marche bien.
Vous avez raison : nul besoin de passer par Word, Excel permet de tout faire, le tableau et l'attestation.
Je referai d'autres tests dans les prochains jours et je vous tiens au courant.
Encore mille mercis. A bientôt.
Bonsoir,
Merci @ vous pour vos remerciements collectif dont j'en prend une petite part !
@ bientôt
LouReeD
Bonsoir à toutes et tous,
Je viens d'expérimenter les solutions que vous m'avez proposées.
Cela fonctionne très bien, malgré quelques espaces que je ne parviens pas à réduire. Mais c'est un détail.
Merci beaucoup de votre aide !
Une petite question à ZeChris : comment obtenez-vous la feuille "courrier", avec les multiples pages à l'infini ?
Merci.
Bonjour à toutes et tous,
Voici ce que donne la création d'attestations d'après le tableau Excel :
Sur le pdf, le résultat est :
J'ai tenté de réduire les espaces engendrés sur le pdf, dûs à l'insertion des cellules, mais en vain.
Je souhaiterais également écrire les noms de famille en capitales et insérer le nom de la feuille à l'endroit où se trouve "l'année 2022" afin que l'année corresponde au nom de la feuille. J'ai essayé aussi plusieurs solutions. Je n'y suis pas arrivé.
Avez-vous une idée ?
Merci beaucoup.
Bonsoir,
Désolé pour ma réponse tardive. Pour la question des espaces et l'année, remplace
'remplissage automatique courrier
Range("A30") = civil & " " & prénom & " " & nom
Range("B30") = somme & " euros"
par :
'remplissage automatique courrier
Range("A30") = civil & " " & prénom & " " & nom & " " & somme & " euros" & " au titre de ses cotisations pour l'année " & ws
ça devrait le faire
Pour la question du choix de plages, laisse moi un peu digérer les repas de fin d'année et je t'explique tout ça
Ayé, j'ai fini de digérer.
Concernant donc ta question sur les multiples pages :
Je fais une boucle sur chaque cellule sélectionnée, qui traite donc chaque nom un par un
On défini la ligne à traiter (variable ligneA), ce qui nous permet de récupérer nom prénom ....
puis on génère le PDF et on passe à la cellule suivante.
Voici comment fonctionne le principe de la boucle sur les cellules :
'ma variable MaPlage sera de type range (sélection de cellules)
Dim MaPlage As Range
' cette variable MaPlage contient les cellules sélectionnées)
Set MaPlage = Selection
' je ne sais pas trop expliquer la ligne suivante, désolé. Si quelqu'un sait ....
ActiveWorkbook.Names.Add Name:="MaPlage", RefersToR1C1:=MaPlage
MaPlage.Select
'ma variable d sera de type range (ici une cellule)
Dim d As Range
' je défini le nom de l'onglet (de l'année donc) dans une variable ws
Dim ws As String
ws = ActiveSheet.Name
' pour chaque cellule dans ma sélection de cellules
For Each d In MaPlage
'je génère ma feuille pdf en remplissant d'abord mon onglet "courrier"
' code ...................
' et je passe à la cellule suivante
Next d
Par contre, je viens de m'appercevoir qu'il y a toute une partie du code qui ne sert à rien :
' comparaison des noms et prénoms déjà venus
Worksheets(ws).Activate
Dim lignetest As Integer
Dim nomtest As String
Dim prénomtest As String
Dim datetest As String
Dim doublon As String
doublon = "non"
For lignetest = 15 To 500
nomtest = Cells(lignetest, "C")
prénomtest = Cells(lignetest, "D")
datetest = Cells(lignetest, "B")
If nom = nomtest And prénom = prénomtest And dateconvoc <> datetest Then
doublon = "oui"
End If
Next lignetest
j'ai du copier un bout d'une macro que j'avais créée, et j'ai été un peu vite en besogne. Ce bout de code me servait, pour générer des convocations, à vérifier si la personne était déjà venue, et à ajouter un mot dans le nom du pdf si besoin.
J'espère avoir répondu à ta question. N'hésite pas si besoin
Bonjour à toutes et tous,
Bonne et heureuse année à tous les passionnés d'Excel. Et aussi aux autres.
ZeChris, merci infiniment de ton aide précieuse !
Voici le résultat de notre travail :
J'ai changé quelques petites choses : j'ai fusionné les cellules de la date et j'ai écrit le texte entier sur une seule cellule fusionnée, comme tu me l'as conseillé. Mais je suis allé plus loin. Et c'est beaucoup mieux.
Ce qui donne :
Je suis d'accord avec toi sur la suppression du passage sur les doublons. Je n'en voyais pas non plus l'utilité, mais je ne suis pas spécialiste.
Je n'ai pas compris ta séquence sur les boucles car c'est la même chose qu'avant. Ou c'est moi qui ne vois pas ?
En revanche, je n'ai pas réussi à écrire les noms de famille en CAPITALES.
Et si je peux abuser, j'aimerais pouvoir mettre en gras les prénoms et les noms de famille (qui seraient déjà en CAPITALES), ainsi que les sommes et l'année.
Merci encore, c'est vraiment génialissime !!!
Bonsoir et bonne année à toi aussi hadaga.
J'ai refait la macro en prenant en compte tes dernières demandes, j'espère que cela répondra à tin besoin.
Concernant les boucles, je suis pas certain de comprendre ta question. L'idée est que tu peux sélectionner plusieurs noms à la fois (avec CTRL par exemple), et tu lance ta macro, qui te génère un pdf différent pour chaque nom sélectionné.
Sub courrier()
Application.ScreenUpdating = False
Dim ligneA As Integer
Dim civil As String, nom As String, prénom As String, somme As String, ws As String
Dim MaPlage As Range, d As Range
Set MaPlage = Selection
ActiveWorkbook.Names.Add Name:="MaPlage", RefersToR1C1:=MaPlage
MaPlage.Select
ws = ActiveSheet.Name
For Each d In MaPlage
ligneA = d.Row
' première lettre de chaque mot en majuscule
For Each X In Range(Cells(ligneA, "B"), Cells(ligneA, "C"))
X.Value = Application.Proper(X.Value)
Next X
civil = Cells(ligneA, "A")
prénom = Cells(ligneA, "B")
nom = UCase(Cells(ligneA, "C")) ' pour mettre le nom en majuscules
somme = Cells(ligneA, "T")
Worksheets("Courrier").Activate
Range("A22") = ""
Range("A29") = ""
'remplissage automatique courrier
Range("A22") = "Paris, le " & Format(Date, "d mmmm yyyy")
Range("A29") = "Je soussigné, Franck PLANTET, trésorier de l'association référencée ci-dessus, certifie avoir reçu de " & civil & " " & prénom & " " & nom & " la somme de " & somme & " euros au titre de ses cotisations pour l'année " & ws & " par chèques bancaires."
contenu = Range("A29") 'Contenu de la cellule
tab_contenu = Split(contenu, " ")'Contenu divisé en tableau
longueur_nom_prénom = Len(tab_contenu(14)) + Len(tab_contenu(15)) + 1 'Longueur nom prénom
' calcul de la position de départ du nom / prénom
j = 1
For i = 0 To 13
j = j + 1 + Len(tab_contenu(i))
Next i
longueur_euros = Len(tab_contenu(19))'Longueur euros
l = 1
For k = 0 To 18
l = l + 1 + Len(tab_contenu(k))
Next k
longueur_année = Len(tab_contenu(28)) 'Longueur Année
m = 1
For k = 0 To 27
m = m + 1 + Len(tab_contenu(k))
Next k
'passer données en GRAS
Range("A29").Characters(j, longueur_nom_prénom).Font.Bold = True
Range("A29").Characters(l, longueur_euros).Font.Bold = True
Range("A29").Characters(m, longueur_année).Font.Bold = True ' année case A29 en gras
' Pour mettre en gras l'année en cellule A22
contenu_date = Range("A22") 'Contenu de la cellule date
tab_contenu_date = Split(contenu_date, " ") 'Contenu divisé en un tableau de 3 parties
longueur_date = Len(tab_contenu_date(4)) 'Longueur date
j = 1
For i = 0 To 3
j = j + 1 + Len(tab_contenu_date(i))
Next i
Range("A22").Characters(j, longueur_date).Font.Bold = True
' enregistrement PDF
Dim Chemin As String
Dim Fichier As String
Chemin = ActiveWorkbook.Path & "\"
Fichier = nom & " " & prénom & " " & "Attestation" & " " & "2022" & ".pdf"
Worksheets("Courrier").ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin & Fichier _
, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, From:=1, To:=1, OpenAfterPublish:=False
Worksheets(ws).Activate
Next d
End Sub
N'hésite pas à revenir vers moi pour plus d'infos
Bonne soirée
Bonjour à toutes et tous,
Mon cher ZeChris, je suis émerveillé par les solutions que tu me donnes : non seulement ça règle mes problèmes de tableau, mais en plus J'APPRENDS. Merci infiniment !!!! J'ai appris davantage avec ce modeste fichier qu'avec tous les tutoriels que j'ai consultés auparavant.
Je ne voudrais pas abuser de ton temps, ni de ta générosité à venir en aide au boulet que je suis. Mais comme ma curiosité est insatiable, je voudrais savoir si tu as des réponses aux questions qui n'ont pas manqué d'apparaître après la résolution des difficultés précédentes.
Première question : lorsque je sélectionne une ligne pour éditer une attestation (exemple : la ligne 18 de Mr Prénom15 NOM15), le nom, qui était en capitales dans la cellule C18, apparaît soudain en minuscules avec la seule première lettre en majuscule. C'est un détail insignifiant, mais ça m'intrigue.
Deuxième question : il m'est apparu, à l'usage, que ce serait plus joli de mettre en gras la civilité (Mr / Mme) en plus du prénom et du nom ; dans le même ordre d'idée, je me suis dit que associer le terme "euros" à la somme et le terme "année" à l'année, je veux dire mettre tout cela en gras, serait d'un meilleur effet.
Mais voici ce que cela donne :
Comme tu peux le voir sur le .xlsm, NOM15 devient Nom15 et j'ai modifié le code sur la macro pour englober les termes dont je parle plus haut. Et je ne comprends pas pourquoi le dernier caractère de chaque tableau n'est pas converti en gras, c'est-à-dire le 5 de 15, le s de "euros" et le 2 de 2022.
Encore merci pour ton aide très précieuse.
A bientôt.
Hadaga.
Bonsoir à toutes et tous,
Je me permets de reposer une question que j'avais émise il y quelques temps.
Voici les fichiers .xlsm et pdf concernés, que ZeChris m'avait aidé à mettre élaborer.
J'ai beau chercher, rien dans le code vba n'explique que les fins de mots ne soient pas converties en gras.
Si quelqu'un a une solution, je suis impatient de la connaître !
Merci beaucoup de votre aide.
Bonne soirée.
Hadaga.
Bonsoir
Désolé d'avoir mis autant de temps pour répondre. J'ai réfléchi, et je te propose le code suivant
J'espère que cela répond à ton problème
Sub courrier()
Application.ScreenUpdating = False
Dim ligneA As Integer
Dim civil As String, nom As String, prénom As String, somme As String, ws As String
Dim MaPlage As Range, d As Range
Set MaPlage = Selection
ActiveWorkbook.Names.Add Name:="MaPlage", RefersToR1C1:=MaPlage
MaPlage.Select
ws = ActiveSheet.Name
For Each d In MaPlage
ligneA = d.Row
civil = Cells(ligneA, "A")
prénom = Application.Proper(Cells(ligneA, "B")) ' première lettre en majuscule
nom = UCase(Cells(ligneA, "C")) ' pour mettre le nom en majuscules
somme = Cells(ligneA, "T")
Worksheets("Courrier").Activate
Range("A22") = ""
Range("A29") = ""
'remplissage automatique courrier
Range("A22") = "Paris, le " & Format(Date, "d mmmm yyyy")
Range("A29") = "Je soussigné, Franck PLANTET, trésorier de l'association référencée ci-dessus, certifie avoir reçu de " & civil & " " & prénom & " " & nom & " la somme de " & somme & " euros au titre de ses cotisations pour l'année " & ws & " par chèques bancaires."
' mise en gras
Range("A22").Characters(WorksheetFunction.Find(Format(Date, "d mmmm yyyy"), Range("A22")), Len(Format(Date, "d mmmm yyyy"))).Font.Bold = True
départ = WorksheetFunction.Find(civil, Range("A29"))
Range("A29").Characters(Start:=départ, Length:=Len(civil)).Font.Bold = True
départ = WorksheetFunction.Find(prénom, Range("A29"))
Range("A29").Characters(Start:=départ, Length:=Len(prénom)).Font.Bold = True
départ = WorksheetFunction.Find(nom, Range("A29"))
Range("A29").Characters(Start:=départ, Length:=Len(nom)).Font.Bold = True
départ = WorksheetFunction.Find(somme, Range("A29"))
Range("A29").Characters(Start:=départ, Length:=Len(somme)).Font.Bold = True
départ = WorksheetFunction.Find(ws, Range("A29"))
Range("A29").Characters(Start:=départ, Length:=Len(ws)).Font.Bold = True
' enregistrement PDF
Dim Chemin As String
Dim Fichier As String
Chemin = ActiveWorkbook.Path & "\"
Fichier = nom & " " & prénom & " " & "Attestation" & " " & ws & ".pdf"
Worksheets("Courrier").ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin & Fichier _
, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, From:=1, To:=1, OpenAfterPublish:=False
Worksheets(ws).Activate
Next d
End Sub
Bonjour ZeChris,
Je te souhaite une excellente 2024, avec une très bonne santé et tout ce qui te rendra heureux.
Je m'excuse pour le retard de ma réponse.
Le code fonctionne parfaitement !
Je te remercie infiniment !
A bientôt.
Hadaga.