Saviez-vous qu'il était possible d'imprimer des fichiers autres qu'Excel directement à partir de VBA? Vous pouvez imprimer des fichiers PDF, des fichiers texte (.txt, .log, …) etc. grâce aux quelques lignes de code VBA.
Très utile si vous voulez imprimer des factures, des fiches de paie etc. en PDF à partir de votre fichier Excel contenant des données.
La seule chose dont vous avez besoin est le chemin complet (dossier & nom du fichier) du fichier à imprimer.
Code VBA pour imprimer un fichier PDF
Voici le code de base qui imprime un fichier PDF. Il vous suffit de copier ce code VBA dans un Module de votre projet et de changer le chemin vers le fichier à imprimer:
1 2 3 4 5 6 7 |
Sub ImpressionDeFichier() 'par Excel-Malin.com ( https://excel-malin.com ) Dim FichierAImprimer As Variant FichierAImprimer = "C:\MonDossier\MonFichier.pdf" '<-- chemin complet du fichier à imprimer CreateObject("Shell.Application").Namespace(0).ParseName(FichierAImprimer).InvokeVerb ("Print") End Sub |
Attention: n'oubliez pas que le code va utiliser l'imprimante qui est définie comme principale dans votre système.
Fonction VBA générique pour l'impression des fichiers
Pour rendre ce code plus flexible et plus facilement utilisable dans diverses situations, nous pouvons le transformer en une FONCTION VBA qui utilisera un paramètre: le chemin complet vers le fichier. Ainsi, il n'y aura pas de mention d'un fichier particulier dans votre code. C'est plus propre, plus pratique et surtout très facile à utiliser dans des boucles.
Voici donc le code de la fonction…
1 2 3 4 5 |
Public Function ImprimerFichier(FichierAImprimer As Variant) 'par Excel-Malin.com ( https://excel-malin.com ) CreateObject("Shell.Application").Namespace(0).ParseName(FichierAImprimer).InvokeVerb ("Print") End Function |
Utilité de l'impression dans des applications VBA en Excel
Vous vous demandez peut-être quel est l'intérêt d'imprimer des fichiers PDF à partir d'Excel…
Imaginez que vous ayez un fichier Excel de comptabilité. Il suffit d'y ajouter les noms (et éventuellement les dossiers) de fichiers de factures. Ensuite, vous pouvez, avec une simple utilisation de boucles, imprimer par exemple toutes les factures pour une date spécifique. Ou pour un mois donné. Ou encore toutes les factures d'un fournisseur donné. Idem pour les factures émises: vous pouvez facilement imprimer toutes les factures envoyés (ou à envoyer) à un client particulier.
De même pour la gestion du personnel: vous voulez imprimer toutes les fiches de paie d'un employé? Ou les fiches de paie de janvier de tous les employés? Rien de plus facile en utilisant le code ci-dessus…
Sinon, cette fonction a une autre utilité: elle vous permettra, par exemple, d'imprimer tous les fichiers dans un dossier particulier. Ou par exemple tous les fichiers PDF dans un dossier particulier. Les combinaisons sont presque infinies.
Plus de détails sur la méthode .InvokeVerb
sur le site de Microsoft…
Pour aller plus loin en VBA
Pour terminer, voici quelques articles qui pourraient vous être utiles lors de l'élaboration de vos macros VBA…
- Liste de toutes les fonctions VBA – toutes les fonctions au même endroit!
- Manipulation des fichiers dans VBA
- Gestion des dates et du temps en VBA
- Comment (de)compresser des fichier et dossiers avec VBA
- Calculer la SOMME en VBA
- VBA: envoyer un email à partir d'Excel
20 commentaires sur “Imprimer un fichier PDF avec VBA dans Excel”
Bonjour
Est-ce que ce code fonctionne aussi sur la version Access 2016 ?
Je n'ai pas de message d'erreur mais l'impression ne se fait pas, ni ne va dans le spooler.
Merci pour votre site.
Bonjour Paul,
comme ça, je ne sais ni affirmer, ni infirmer cette info.
Quand j'ai un peu de temps, je vais le tester et je vous tiens au courant.
Cordialement, Martin
Merci, mais n'y perdez pas trop de temps :). Si je trouve une solution, je l'ajouterai ici.
Bonjour,
j'ai repris votre code en le modifiant légèrement, mais malheureusement, ce la ne fonctionne pas …
Nouveau code :
Sub ImpressionDeFichier()
'par Excel-Malin.com ( https://excel-malin.com )
Dim FichierAImprimer As String
Destination = ThisWorkbook.Path & "\Rapports_PDF\"
FichierAImprimer = Destination & "test.pdf" '<– chemin complet du fichier à imprimer
CreateObject("Shell.Application").Namespace(0).ParseName(FichierAImprimer).InvokeVerb ("Print")
End Sub
En effet, j'obtiens le message suivant : "Erreur d'execution '91' : Variable objet ou variable de bloc With non definie "
Y a t il une cas à cocher dans le VBE / outils / reference ?
Je suis sous office 365 / Windows 07 et mon imprimante par défaut est PDF Creator (car je veux créer un rapport avec plusieurs feuilles de mon fichier excel)
Merci d'avance pour votre aide !
Bonjour Eric,
2 remarques:
1) ce message d'erreur correspond au cas où le fichier mentionné n'existe pas. Vous pouvez le vérifier avec ce code:
"VBA: Vérifier si fichier existe"
2) Je viens de tester avec une imprimante virtuelle (CutePDFWriter) avec un fichier existant et le fichier "s'imprime" comme il faut. Donc je pense que le fait qu'il s'agisse d'une imprimante virtuelle ne pose pas de problème…
J'espère que cela vous aidera à résoudre votre problème.
Cordialement Martin
En late binding comme ici les variables passées à Shell doivent être impérativement de type Variant
d'où l'erreur à cause de la variable String utilisée.
Par contre en early binding – en activant la référence – aucun souci …
Merci pour le tuyau Marc!
Cordialement, Martin
Bonjour,
est-il possible de modifier cette commande que l'impression soit faite sans qu'il ouvre le fichier ?
merci
Bonjour !
Est-il possible de combiner ceci avec une impression d'une feuille excel pour créer un seul et même fichier ? J'ai un document avec plusieurs fiches produits auxquelles je dois rattacher des fiches techniques en pdf est-ce réalisable. Merci !
Bonjour,
Esct-ce qu'il y a une référence particulière à activer ? Parce que pour ma part, rien de se passe. Que j'en fasse une procédure ou une fonction, il ne se passe rien. Je suis sous une version 2010.
Merci.
Précision : Je viens de tester l'impression de fichier .png et .docx et cela fonctionne. Le problème est pour les fichiers .pdf
C'est très étrange. Faut-t-il un lecteur PDF particulier ? J'utilise Sumatra PDF portable. J'ai essayé de mettre Edge en lecteur par défaut, mais cela ne s'imprime toujours pas.
Bonjour Seb,
normalement, il ne faut pas activer de référence particulière.
Il est par contre possible que votre lecteur PDF ne soit pas compatible avec les fonctions Microsoft. (regardez ici: https://docs.microsoft.com/en-us/windows/win32/shell/folderitem-invokeverb)
Moi j'utilise Adobe Reader DC (qui est je pense pré-installé dans les dernières versions de Windows) et tout se passe sans problème.
Bien à toi, Martin
Bonjour, j'ai une erreur d’exécution 91 sur la ligne principale de la fonction. Mes chemins d'acces sont bons et le pdf est bien présent. J'ai bien acrobat reader dc sur mon ordi.
Bonjour,
je viens d'adapter les fonctions en remplaçant le type de variable de
String
àVariant
comme suggéré par Marc L dans un des commentaires.Cela devrait résoudre le problème. Vous pouvez alors réessayer.
Cordialement, Martin
Bonjour,
J'ai essayé d'adapter la fonction pour qu'avec une boucle, cela puisse imprimer tous les fichiers pdf dans un dossier. Mais j'avoue que mon do while ne marche pas du tout. Pourriez vous avoir la gentillesse de m'expliquer comment vous auriez fait votre boucle pour imprimer toutes les factures dans votre screen avec la fonction que vous avez créé.
Bonjour,
Merci pour vos informations.
Pour ma part, je me demande s'il est obligatoire d'avoir:
==> "La seule chose dont vous avez besoin est le chemin complet (dossier & nom du fichier) du fichier à imprimer."
Est-il possible de faire plusieurs macro de ce type:
Bouton 1 : Imprimer le PDF actif (à l'écran) en format A4 sur l'imprimante 1
Bouton 2 : Imprimer le PDF actif (à l'écran) en format A1 sur l'imprimante 2
Cette demande est dû à impression de nombreux PDF avec des formats différents.
Merci bien
Bonjour,
je voulais savoir s'il était possible de modifier ce code pour que l'impression se déroule sans que le fichier ne soit ouvert ?
merci
Bonjour, les imprimantes de mon réseau requiert un mot de passe, est t'il possible de le passer en paramètre dans le code ?
j'ai utilisé votre fonction d'impression de fichier Pdf, qui fonctionne bien
cependant le problème que je rencontre est de pouvoir utiliser différentes imprimantes en fonction du type de document à imprimer
j'ai utilisé SetDefaultPrinter qui m'a permis de sélecter l'imprimante pour la première impression mais le problème subsiste car acrobat reste ouvert et garde l'imprimante initiale, il faudrait "tuer" l'application pour la redémarrer mais je n'ai pas trouvé de méthode
merci si vous avez une solution
Bonjour,
tout d'abord merci, cela fonctionne tres bien.
Dans mon cas je souhaiterais imprimer que la premiere page. Est-ce que c'est possible avec le code que vous proposez ?
J'ai bien entendu cherche sur internet mais toutes les autres solutions sont trop lourde pour juste imprimer que la premiere page.
Merci