Ouvrir ou imprimer un fichier quelconque à partir de son nom
Je dispose de fichiers d’extensions diverses (
.xls
,.xlsx
,.ppt
,.msg
,.xcf
et n’importe quoi d’autre !). Je voudrais ouvrir ce fichier dans le logiciel associé. Comment faire ?
La solution
La technique consiste à passer par les fonctions API de Windows (ici ShellExecuteA
). Commencez par recopier tout ce qui suit dans un module standard de votre base de données :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
' --- DECLARATION API WINDOWS Private Declare Function ShellExecute _ Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hWnd As Long, ByVal lpOperation As String, _ ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) _ As Long ' --- ' OUVRIR/IMPRIMER UN DOCUMENT A PARTIR DE SON CHEMIN ' --- ' Entrée : strFichier <- Nom du fichier à ouvrir/imprimer. ' strOperation <- Opération sur le fichier. ' explore, find, open, print ' strParametres <- Paramètres à transmettre au programme, ' lorsque strFichier est un .exe. ' strDossier <- Dossier d'exécution par défaut (pour un .exe). ' awsAffichage <- Mode d'affichage de la fenêtre. ' Public Function ShellExec( _ ByVal strFichier As String, _ Optional ByVal strOperation As String = "Open", _ Optional ByVal awsAffichage As VbAppWinStyle = VbAppWinStyle.vbNormalFocus, _ Optional ByVal strParametres As String = "", _ Optional ByVal strDossier As String = "") _ As Boolean Dim lngRes As Long lngRes = ShellExecute(Access.hWndAccessApp, strOperation, _ strFichier, strParametres, strDossier, awsAffichage) ShellExec = (lngRes < 0) Or (lngRes > 32) End Function |
Mode d’emploi
Vous pouvez utiliser la fonction ShellExecute
directement. Mais comme ses paramètres ne sont pas dans l’ordre le plus pratique, je vous conseille plutôt d’utiliser son « wrapper » : ShellExec
. Cette autre fonction reçoit les paramètres suivants :
strFichier
: Chemin complet du fichier à ouvrir.
Il peut aussi s’agir d’un fichier exécutable, ou d’une adresse Internet.strOperation
: Type d’opération sur le fichier («open
» par défaut).
Open
= Ouvrir le document, lancer une exécutable, accéder à une adresse web.
Print
= Imprimer le document (sistrFichier
s’y prête !)
Explore
= Ouvrir une fenêtre de l’Exploration Windows, positionnée dans le dossier donné parstrFichier
.
Find
= Presque pareil que Explore, sauf que c’est une fenêtre de recherche qui est ouverte.strParametres
: Paramètres éventuels à transmettre àstrFichier
, lorsque celui-ci est un exécutable.strDossier
: dossier de travail par défaut.awsAffichage
: mode d’affichage de la fenêtre (mode Normal par défaut).
La fonction ShellExec()
renvoie True
si l’opération a réussi, False
sinon. Vous devriez donc l’employer de cette manière :
1 2 3 |
If Not ShellExec(...) Then MsgBox "Impossible d'ouvrir le document", vbExclamation End If |
Exemples d’utilisation
Les exemples qui suivent reprennent juste le ShellExec()
, pas le bloc If /End If
du dessus, que vous devriez bien sûr garder !
- Ouvrir un document Word 2003 :
ShellExec("C:\...\Mon CV.doc")
- Ouvrir un document Excel 2007 :
Shell("C:\...\Stats.xlsx")
- Imprimer le même document Excel 2007 :
Shell("C:\...\Stats.xlsx", "print")
- Ouvrir le site SelfAccess en plein écran :
Shell("http://www.self-access.com", "open", vbMaximizedFocus)
Shell("http://www.self-access.com", , vbMaximizedFocus)
- Ouvrir une image au format Gimp :
Shell("C:\...\dessin.xcf")
- Ouvrir le dossier Windows :
ShellExec("C:\Windows", "explore")
- Ouvrir le dossier Windows, et démarrer une recherche dans le sous-dossier
system32
:
ShellExec("system32", "find", vbMaximizedFocus, , "C:Windows")
- Ouvrir une fenêtre de commande, lister le contenu du dossier C:WindowsSystem32, et laisser la fenêtre active à la fin :
ShellExec("cmd.exe", "open", vbNormalFocus, "/K dir", "C:WindowsSystem32"
) - Pareil, en fermant la fenêtre à la fin :
ShellExec("cmd.exe", "open", vbNormalFocus, "/C dir", "C:WindowsSystem32"
)
Didier Granier > L’article est en ligne à cette adresse. (il traite aussi le problème de Stéphane, plus haut). Bons tests !
Didier Granier > Je prépare un article sur ce sujet pour bientôt.
Bonjour Monsieur Inisan,
Je voudrais utiliser votre solution sur des systèmes 32 et 64 bits
Pouvez vous me dire quels sont les paramètres pour les versions 64 bits et comment le gérer automatiquement au lancement de la procédure.
Merci de votre aide.
Bonjour,
à mon grand désespoir, ce code qui me serait très utile a provoqué une instabilité de ma base Access 97. il m’est impossible de compiler les modules, et l’appel de la fonction ShellExec fait planter mon appli.
tout redevient normal dès que je supprime le module. Y’a t’il une incompatibilité avec Access 97 ? je développe sous Windows 7 64 bits…
Merci d’avance de votre aide.
Stéphane
CI Dumont > Effectivement, Acrobat Reader reste tourner après impression. Une piste consiste à « tuer » explicitement le processus Acrobat Reader (
AcroRd32.exe
) par ceci :Bonjour Monsieur INISAN,
je lis avec intérêt ce blog, cela fonctionne sans souci.
J’ai toutefois une question : une fois un document imprimé par cette fonction, exemple un document .pdf, Acrobat reader reste ouvert en arrière plan.
Comment donc, une fois l’impression terminée, fermer ce/ces programmes selon le type de fichier imprimé. De la sorte, je ne suis pas obligé de procéder manuellement à cette fermeture.
Vous serait-il agréable de m’expliquer comment y arriver.
D’avance, je vous suis très obligé.
Meilleures salutations.
CL DUMONT
Demba Badji > Quel est le code qui déclenche l’impression ?
Bonjour Monsieur Inisan,
J’ai élaboré un programme de Gestion du Courrier avec Access 2003, je souhaiterais pouvoir joindre le courrier scanné dans chaque enregistrement concerné.
J’ai essayé le modéle traité dans ce chapitre mais c’est le même fichier qui s’ouvre sur tous les enregistremments.
Merci de me donner un coup de main
Demba Badji
Julien > Il se peut qu’Access garde le focus (et laisse le document Word s’ouvrir en arrière plan). Je n’ai pas de quoi tester sous la main, mais ça peut dépendre des versions.
Parfait, merci pour l’info. Ça fonctionne bien en effet.
La seule chose qui ne fonctionne pas, c’est lorsque je veux garder mon document .docx affiché.
Le fichier reste ouvert, mais je reviens toujours à ma fenêtre Access. Je suis sous Office 2007. voici ma ligne de code:
Call ShellExec(Repert, « open », vbMaximizedFocus)
Lorsque j’entre les critères de la focntion, je ne semble rien avoir pour la variable awsAffichage . Est-ce le problème?
Merci!
Julien > Ça marche sans
Call
, à condition d’enlever les parenthèses. Les parenthèses correspondent à un appel de fonction, l’absence de parenthèses à un appel de procédure.Rebonjour,
Je crois avoir trouvé la réponse. Il faut mettre Call devant les instructions Shell. Ça semble fonctionner.
Merci!
Julien
Rebonjour,
Je crois avoir trouvé la réponse. Il faut mettre Call devant les instructions Shell. Ça semble fonctionner.
Merci!
Julien
Bonjour,
J’ai recopié le code ci-haut dans un module. Je veux pouvoir des fois ouvrir un fichier, des fois l’imprimer, selon la situation.
Lorsque que j’écris: ShellExec (« D:DOC1.docx »)
le fichier s’ouvre.
Si je tente d’écrire : ShellExec (« D:DOC1.docx », « print »), j’obtiens le message d’erreur suivant:
Erreur de compilation; Attendu : =
Est-ce à cause de cette ligne:
Optional ByVal strOperation As String = « Open », ?
J’ai essayé de remplacer le -« Open » par -« », ça ne fonctionne pas.
Est-ce que je dois faire une fonction pour ouvrir, puis une autre pour imprimer?
Merci!
Julien
c’est bien ton blog toujour aussi interessan,t! 🙂