Remplir un formulaire de PDF depuis Excel.

12
23883

Dans cette video je vais vous montrez comment remplir un formulaire qui se trouve dans un fichier PDF et puis de le sauvegarder dans un dossier depuis un tableau qui contient les informations qui doivent être placer dans le formulaire.

Mettre Microsoft PDF print par default

Nous allons commencer par le début et donc mettre Microsoft PDF print comme choix d’imprimante par default sinon quand nous allons vouloir sauvegarder le fichier PDF on risque de non pas les sauvegarder mais de les imprimes.

Pour cela aller dans Imprimantes et scanner et placer Microsoft Print to PDF par défaut

Trouver un fichier PDF avec un formulaire

Désormais il faut trouver un formulaire PDF moi j’en ai créé une qui est composé de quelque champs notamment prénom, nom, âge, rue, numéro, ville et pays.

si vous ne savez pas comment créer un tel formulaire vous pouvez en retrouver gratuitement online. Dans cet exemple j’ai utilisé un logicielle avec une version gratuite qui place une watermark

Le ficher Excel

Nous avons aussi une table Excel qui contiens les informations à placer dans chaque formulaire et l’objectif est d’avoir une ligne d’information pour chaque formulaire

Ouvrir le Fichier PDF

Alors nous allons commencer par ouvrir notre fichier PDF depuis notre bouton Start. Pour cela nous allons créer une variable qui se nomme filePath et qui contiendra l’emplacement du fichier PDF

Dim filePath As String
filePath = "E:\tuto de rien\Excel\Pdf form update\Simple contact form.pdf"

Pour l’ouvrir rien de plus simple avec createObject

CreateObject("Shell.Application").Open (filePath)

Sélectionner la zone de texte

Désormais nous allons devoir sélectionner l’emplacement de la première zone de texte et comme vous pouvez vous en douter on ne peut pas dire prend la souris et place là dans la première zone de texte. Pour cela nous allons devoir utiliser les raccourci clavier comme la touche tabulation.

Dans notre exemple il me faut appuyer 9 x sur la touche tabulation avant d’arriver sur la première ligne à remplir. Donc nous allons créer une fonction qui va faire cela pour nous dans notre code vba.

Private Sub fieldTab(amount As Integer)
    Dim x As Integer
    For x = 1 To amount
        Application.SendKeys "{TAB}", True
    Next
End Sub

Et puis nous allons faire appelle à cette méthode dans notre bouton et indiquer qu’il doit le faire 9 x. mais avant de commencer cela nous allons devoir attendre que le fichier s’ouvre donc nous allons devoir dire à notre code d’attendre quelque seconde et tout dépend à quelle vitesse votre fichier PDF s’ouvre.

Application.Wait Now + 0.00003

‘number of tabs before the first input field in the PDF form

fieldTab 9

Remplir les zones de textes

il est temps de remplir nos champs de texte et la aussi nous allons crée une fonction qui va donc remplir le champs et puis passer au suivant avec une tabulation.

Private Sub setInfo(info As String)
    Application.SendKeys info, True
    Application.SendKeys "{TAB}", True

End Sub

Et nous allons remplir chaque champs grâce à cette fonction, vérifier bien quelle champs se remplie apres chaque tabulation. Dans mon exemple le premier champs First name est la dernière tabulation donc je vais prendre cela en compte

'set last name
setInfo “SampleLastName”
'set age
setInfo “SampleAge”
'set street
setInfo “SampleStreet”
'set house number
setInfo “SampleNumber”
'set city
setInfo “Samplecity”
'set country
setInfo “SampleCountry”
'set first name
setInfo "SampleFirstName"

Sauvegarder le fichier PDF

Bon nous avons notre fichier PDF rempli avec nos informations il est temps de les sauvegarder dans un emplacement voulut.  Pour cela nous allons créer aussi un nouvelle fonction qui aura besoin de deux paramètre le nom final du fichier et l’endroit.

savePDF .Range("b" & line).Value & "_" & .Range("c" & line).Value, "E:\tuto de rien\Excel\Pdf form update\saved_PDF\"

Pour cela nous allons donc dire qu’il faut ouvrir la page d’impression avec la commende ctrl + p mais avec les sendKeys donc ^(p) ici aussi nous allons attendre quelque seconde

Puis nous allons appuyer sur la touche entrée mais il faut savoir qu’il y a deux touche d’entrée sur notre clavier celui près des touches de texte et l’autre du coté du pavé numérique. Alors si vous n’avez pas de pavé numérique et que vous indiquer cette touche, rien ne se passera donc nous allons utiliser celui à coter des lettres comme suite « ~» avec la touche Tilde.

Puis nous allons sélectionner l’emplacement du nom du fichier qui peut être sélectionner avec la touche raccourci ALT + n donc %n et pour finir nous allons enregistre avec ALT + E donc %e

Mais ce n’est pas encore finit car si le fichier existe déjà un message d’erreur apparait et il faut s’en occuper aussi si c’est le cas donc là nous allons simplement dire que nous allons écraser le fichier existant par le nouveau avec le raccourci ALT + o donc %o.

Désormais c’est fini nous alons fermer le fichier dans mon cas c’est une page web qui s’ouvre donc pour le fermer c’est CTRL + w donc ^w. si sella ne marche pas pour vous chercher le raccourci pur fermer votre lecteur de PDF.

Private Sub savePDF(filename, folder As String)
    Application.SendKeys "^(p)", True
    Application.Wait Now + 0.00003
    Application.SendKeys "~", True
    Application.Wait Now + 0.00003
    Application.SendKeys "%(n)", True
    Application.SendKeys folder & filename, True
    Application.SendKeys "%(e)", True
    Application.Wait Now + 0.00002
    Application.SendKeys "%(o)", True
    Application.Wait Now + 0.00002
    Application.SendKeys "^(w)", True
End Sub

Pfiou nous avons registré notre fichier et c’est fini

Utiliser chaque ligne d’une table

Donc nous avons créer notre structure pour automatiser une transaction mais si nous voulons appliquer cela à toutes les lignes de notre tableau nous allons définir la limite de notre tableau avec une variable lastrow

Dim lastRow As Integer
lastRow = Sheets(1).Range("b9999").End(xlUp).Row

puis nous allons créer une boucle for qui vas aller dans chaque ligne de notre tableau et depuis chaque ligne nous allons prendre les information à placer et les mettre dans le bonne emplacement  comme suite.

Dim line As Integer
    For line = 3 To lastRow
        CreateObject("Shell.Application").Open (filePath)
        Application.Wait Now + 0.00003
        'number of tabs before the first input field in the PDF form
        fieldTab 9
        With Sheets(1)
            'set last name
            setInfo .Range("c" & line).Value
            'set age
            setInfo .Range("d" & line).Value
            'set street
            setInfo .Range("e" & line).Value
            'set house number
            setInfo .Range("f" & line).Value
            'set city
            setInfo .Range("g" & line).Value
            'set country
            setInfo .Range("h" & line).Value
            'set first name
            setInfo .Range("b" & line).Value
            
            savePDF .Range("b" & line).Value & "_" & .Range("c" & line).Value, "E:\tuto de rien\Excel\Pdf form update\saved_PDF\"
        End With
    Next

Et la si nous allons lancer notre code nous allons ouvrir le fichier le remplir et le sauvegarder pour chaque ligne de notre tableau.

Il est important de ne pas toucher votre ordinateur car désormais c’est Excel qui travaille à votre place.

Voila j’espère que cela vous à plus et on se retrouve dans une prochaine vidéo.

12 Commentaires

  1. Bonjour
    A partir de votre excellent tuto je suis en train d’essayer de remplir un PDF (11 champs remplissable) depuis un tableau Excel qui, à terme, devrait avoir une centaine de ligne sur donc 11 colonnes.
    Tant que je suis dans la configuration:
    ‘Set N° de reçu
    SetInfo « N° »
    etc…
    Avec l’automatisme du TAB pour passer au champ suivant tout fonctionne jusqu’à l’enregistrement mais le PDF généré ne se ferme pas et reste affiché avec une fenêtre de commande demandant de quitter. Bon ça c’est un problème. Mais le plus important est que lorsque je passe en configuration:
    Private Sub CommandButton2_Click()
    Dim filePath As String
    filePath = « H:\LES AMIS DE L’ORGUE DE CAUMONT\DONS POUR RELEVAGE\TEST VBA\reçu au titre des dons.pdf »
    Dim lastrow As Integer
    lastrow = Sheets(1).Range(« b9999 »).End(xlUp).Row
    Dim line As Integer
    For line = 7 To lastrow
    CreateObject(« Shell.application »).Open (filePath)
    Application.Wait Now + 0.00003
    Application.SendKeys « {TAB} », True
    With ActiveSheet
    ‘set N° de reçu
    setInfo .Range(« B » & ligne).Value
    ‘Set nom
    setInfo .Range(« C » & ligne).Value
    ‘Set prenom
    setInfo .Range(« D » & ligne).Value
    ‘set adresse
    setInfo .Range(« E » & ligne).Value
    ‘set cp
    setInfo .Range(« F » & ligne).Value
    ‘set commune
    setInfo .Range(« G » & ligne).Value
    ‘set monteur
    setInfo .Range(« H » & ligne).Value
    ‘set montlet
    setInfo .Range(« I » & ligne).Value
    ‘set modevers
    setInfo .Range(« J » & ligne).Value
    ‘set datevers
    setInfo .Range(« K » & ligne).Value
    ‘setdateedit
    setInfo .Range(« L » & ligne).Value

    savePDF .Range(« b » & ligne).Value, « H:\LES AMIS DE L’ORGUE DE CAUMONT\DONS POUR RELEVAGE\TEST VBA\ »
    End With
    Next
    End Sub
    Sub setInfo(info As String)
    Application.SendKeys info, True
    Application.SendKeys « {TAB} », True
    End Sub
    J’ai une fenêtre qui s’ouvre avec ‘Erreur exécution 1004 : Erreur définie par l’application’
    et en bas de cette fenetre en grisé « continuer » accessible FIN / Débogage/ Aide
    Etant debutant en VBA je bloque grave.
    Je suis preneur de toute idée qui me permettrait d’aller au bout et de pouvoir generer ces PDF.
    Merçi d’avance
    Cdt
    GB

  2. Bonjour Super tuto, mais je rencontre un problème. En effet, il ne tient pas compte du chemin indiqué par « folder ». Il sauvegarde le nouveau PdF à la racine du fichier PdF d’origine.

    Avez-vous une correction à m’indiquer ?

    Merci d’avance !

  3. Bonjour, tout fonctionne pour moi, mais il remplis le pdf un page sur deux ?, il sauvegarde bien mais ne remplis pas une fois sur deux,
    mais mon problème est que j’aurrais voulu sauvegarder sans imprimer pour garder le mode pdf modifiable, j’ai pas trouver de code pour les touches ctrl et schift sauvegarder au lieu de ctrl print
    Merci à vous

  4. Bonjour,
    Merci pour ce tuto clair et précis et qui fonctionne parfaitement bien mais en partie de mon côté.
    Car je suis bloqué sur 3point:
    – le premier (vu en commentaire précédent): comment remplir un champs qui demande une coche
    – comment remplir un champs qui dans le formulaire PDF propose une liste déroulante
    – comment ignorer un champs pour pouvoir remplir directement le suivant.

    Merci pour ses précieuses réponses.

    Grégory

  5. Bonjour,
    Merci pour ce tuto,
    est-ce que vous avez une solution pour les accents, en fait quand j’utilise votre méthode les accents disparaissent pour laisser un espace vide, il en est de même pour tous les caratères spéciaux :/
    Merci!

  6. Bonjour,

    Je suis bloquée à la 1ére étape qui est d’ouvrir le fichier PDF depuis le macro
    Mon dossier s’ouvre bien mais pas le fichier.
    C’est un pdf pourtant mais il ne comporte pas l’extension .pdf dans le titre du document.

    Pouvez-vous m’aider svp ?

    Merci d’avance

  7. Bonjour
    La vidéo est super !
    Je suis en train d’essayer de remplir un pdf éditable (CERFA 11580*03) qui a environ 60 champs
    Je ne souhaite remplir que les champs 1 , 39,41,43,44,60 et 61 où les champs 60 et 61 sont des validations VRAI par un x
    Comment passer de la tabulation 1 à 39 par exemple
    fieldTab 61
    With Sheets(1)
    ‘set Code
    SetInfo .Range(« b » & line).Value
    ‘set Nom
    SetInfo .Range(« c » & line).TabIndex = 39 ligne fausse, mais je ne sais pas quoi coder …
    SetInfo .Range(« c » & line).Value
    ‘set Prénom
    SetInfo .Range(« d » & line).Value
    ‘set Adresse
    SetInfo .Range(« e » & line).Value
    ‘set Code postal
    SetInfo .Range(« f » & line).Value
    ‘set Ville
    SetInfo .Range(« g » & line).Value
    ‘set Montant
    SetInfo .Range(« h » & line).Value
    ‘set En lettres
    SetInfo .Range(« i » & line).Value
    ‘set Espèces
    SetInfo .Range(« j » & line).Value
    ‘set Chèque
    SetInfo .Range(« k » & line).Value
    ‘set Virement
    SetInfo .Range(« l » & line).Value

    merci d’avance pour votre aide
    Dominick (Débutant VBA)

  8. Bonjour Daniel.
    J’ai besoins de faire l’inverse.
    C’est de récupérer dans un tableau excel les données de plusieurs formulaires remplis et renvoyés par plusieurs utilisateurs.
    Merci d’avance.

    • Bonjour,
      j’ai le même souci
      J’ai trouvé une solution sous node, mais les retours PDF, bien que visuellement similaires (CERFA) ne sont pas toujours construit à l’identique.
      Problème, il faut les parser.
      As-tu avec VBA avancer sur ce sujet

      Merci

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.