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 :

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 (si strFichier s’y prête !)
    Explore = Ouvrir une fenêtre de l’Exploration Windows, positionnée dans le dossier donné par strFichier.
    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 :

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")

Vous aimerez aussi...

15 réponses

  1. Hervé Inisan dit :

    Didier Granier > L’article est en ligne à cette adresse. (il traite aussi le problème de Stéphane, plus haut). Bons tests !

  2. Hervé Inisan dit :

    Didier Granier > Je prépare un article sur ce sujet pour bientôt.

  3. Didier Granier dit :

    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.

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

  5. Hervé Inisan dit :

    CI Dumont > Effectivement, Acrobat Reader reste tourner après impression. Une piste consiste à « tuer » explicitement le processus Acrobat Reader (AcroRd32.exe) par ceci :

  6. Cl DUMONT dit :

    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

  7. Hervé Inisan dit :

    Demba Badji > Quel est le code qui déclenche l’impression ?

  8. Demba Badji dit :

    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

  9. Hervé Inisan dit :

    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.

  10. Julien dit :

    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!

  11. Hervé Inisan dit :

    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.

  12. Julien dit :

    Rebonjour,

    Je crois avoir trouvé la réponse. Il faut mettre Call devant les instructions Shell. Ça semble fonctionner.

    Merci!

    Julien

  13. Julien dit :

    Rebonjour,

    Je crois avoir trouvé la réponse. Il faut mettre Call devant les instructions Shell. Ça semble fonctionner.

    Merci!

    Julien

  14. Julien dit :

    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

  15. Wiki dit :

    c’est bien ton blog toujour aussi interessan,t! 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *