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

6association.xlsm (23.84 Ko)

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.

Rechercher des sujets similaires à "generer word"