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.
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
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 !
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
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
Bonjour,
Comment faites-vous pour écrire ‘set last name et écrire AUTOMATIQUEMENT les autres commentaires ‘set age etc….
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!
Bonjour,
Avez-vous une réponse concernant les accents ?
Merci d’avance.
Loris
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
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)
Bonjour
As-tu eu une réponse sur ce point car j’ai le même problème sur mon PDF
Merci
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