IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fermer une application via VBA Excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    comptabiltité
    Inscrit en
    Juin 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : comptabiltité

    Informations forums :
    Inscription : Juin 2021
    Messages : 6
    Par défaut Fermer une application via VBA Excel
    Bonjour à tous,

    Après de très nombreuses recherches ici et ailleurs pour permettre à VBA de fermer une application, dans mon cas Acrobat Reader (mais pas que..), je ne trouve pas totalement mon bonheur !
    J'ai cru comprendre qu'il y avait deux façons de le faire : par l'application Shell et la Bibliothèque Acrobat mais c'est trop flou (Où voir les éléments d'une bibliothèque? y a t il un rapport avec les références ? etc)

    Dans mon cas, l'idée est d'imprimer des fichiers PDF d'un répertoire Windows (ok à ce niveau, tout fonctionne) puis de fermer l'application Acrobat Reader qui s'est ouverte pour les impressions (qui évidemment ne s'est pas fermée). Concrètement, j'ai trouvé sur ce site cette petite phrase magique, très simple, qui fonctionne parfaitement. Merci #thom07lamy !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell "TASKKILL /IM AcroRd32.exe /F"
    Dans mon cas, je l'insère après cette ligne (pour laisser le temps aux impressions de se faire) qui elle-même évidemment suit le code pour les impressions. Idem, merci #thom07lamy !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Wait (Now + TimeValue("0:00:10"))

    Partant de là, on peut considérer que la question de "fermer un fichier" est résolue ! MAIS NON. Je voudrais comprendre comment utiliser le code ci-après qui a été proposé, le plus grand nombre de fois, pour ouvrir/imprimer/fermer un fichier pdf.

    Version trouvée sur ce site : (le lien ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
    #If VBA7 Then
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare PtrSafe Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
        ' api pour redresser l'affichage en cas de modification de la caption
        Public Declare PtrSafe Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As LongPtr) As Long
        ' api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
        Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
     
        #If Win64 Then
            Public Declare PtrSafe Function GWLA Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
            Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #Else
            'api pour appliquer le nouveau style a la fenetre (userform)
            Public Declare PtrSafe Function GWLA Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
            Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #End If
     
    #Else
       'api pour trouver et identifier le handle de la fenetre (identifiant de la fenetre
        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
          'api pour appliquer le nouveau style a la fenetre (userform)
        Public Declare Function GWLA Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
        Public Declare Function SWLA Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
         'api pour redresser l'affichage en cas de modification de la caption
        Public Declare Function DMB Lib "user32" Alias "DrawMenuBar" (ByVal hwnd As Long) As Long
         'api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
        ' api pour changer le mode d affichage du userform et activer ou non la fenetre
        Public Declare Function SWA Lib "user32" Alias "ShowWindowAsync" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
     
    #End If

    Ma version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As LongPtr) As LongPtr
    Public Declare PtrSafe Function GWLA Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
    Public Declare PtrSafe Function SWLA Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
     
    Sub Boucle_Sur_Fenetres()
    Dim pointeur As Long
    Dim titre As String
     
    pointeur = FindWindow(vbNullString, "")
    Do While pointeur <> 0
        titre = String(100, Chr$(0))
        GetWindowText pointeur, titre, 100
        titre = Left$(titre, InStr(titre, Chr$(0)) - 1)
        If titre Like "*" & Nom & ".pdf" & "*" Then FermerFenetre pointeur: Exit Sub
        pointeur = GetWindow(pointeur, 2)
    Loop
    End Sub

    Bien trop compliqué à mon goût, j'ai tout de même essayé de l'adapter à ma version (version x64 et non 32bits).
    J'ai vu certains posts qui proposaient d'utiliser une condition : "if VBA 7 then .... else ... end if" pour que cela s'adapte au mieux à toutes les versions d'ordinateurs. OK, I've understood

    Mais par peur de faire planter le système, je préfère demander conseil avant..

    Le code le plus complet que j'ai trouvé vient de Arkham46, notamment sur ce lien, donc Merci Arkham46 pour toutes tes contributions! Cependant, tout ce que je trouve semble porter sur l'ouverture ou l'impression d'un fichier pdf. n'est-il pas ?


    Ainsi, je voudrais :

    - comprendre chacune des lignes "Public Declare PtrSafe Function ..."
    - savoir comment utiliser la Bibliothèque Acrobat / comprendre le lien avec les bibliothèques, les références, les contrôles application/shell/...
    - connaître un code alternatif pour fermer une application / Acrobat

    Quelqu'un pourrait-il m'éclairer svp ???


    J'espère ne pas demander la lune .. et vous remercie tous chaleureusement pour vos contributions

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 022
    Par défaut
    Bonjour.
    Il y a beaucoup de questions, et je n'ai pas toutes les réponses, mais je vais participer de mon mieux.
    En espérant ne pas écrire trop de bêtises car je ne maîtrise pas ce sujet, mais si ça peut aider (et faire réagir ceux qui connaissent) je me lance...

    Dans le désordre :
    - Les versions 64 bits et 32 bits n'utilisent pas toujours les mêmes API (leurs déclarations ne sont pas toujours les mêmes non plus). En 32 bits elles retournent et utilisent généralement un entier (long) de 32 bits, en 64 bits elles retournent et utilisent soit un grand entiers (longlong) de 64 bits, soit un entier (long) de 32 bits. Donc parfois une incompatibilité entre les deux versions (quand on utilise les API) ce qui pose problème.
    Pour y remédier : il faut tester la version utilisée, et mettre une option de compilation, les fameux #If ... #Else ... ce qui permet d'avoir un code compatible 32 et 64 bits. Astucieux.
    - VBA7 c'est pour la version 7 du VBA, à mon avis 32 bits ou 64 bits, mais ça reste à confirmer (la 6 serait donc forcément en 32 bits ?).
    - WIN64 pour savoir si tu tournes en 64 bits. A confirmer aussi.
    - Ensuite, et toujours à vérifier, PtrSafe ne sert à rien, il faudrait mieux utiliser LongPtr qui sera automatiquement en 32 bits sur une version 32 bits et en 64 bits sur une version 64 bits. Ce qui règle certains problèmes.
    - Public Declare PtrSafe Function SWH Lib "user32" Alias "ShowWindow" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long : ça sert à dire à Excel d'aller chercher une API et de l'utiliser, ici l'API ShowWindow dans la bibliothéque user32 que tu utiliseras avec le nom SWH et pas son nom ordinaire (pourquoi ce nom ?), suivent les arguments de la fonction.
    - Application.Wait : ça sert à faire une pause, pour toi dans le code que tu montres, de 10 secondes (il me semble). Car Shell que tu as dû utiliser avant est asynchrone (il passe au code suivant sans attendre la fin du traitement). Je pense que tu veux attendre la fin de quelque chose, mais quoi ? Dans ce cas on utilise FindWindow, qui sert savoir si une fenêtre est ouverte. Tant qu'elle l'est on attend, quand elle ne l'est plus on peut passer à la suite du code (ou l'inverse suivant les cas).
    - Pour fermer Acrobate, je te propose si c'est possible, d'utiliser sendkey pour envoyer la touche Alt+F4 (ou Ctrl Q, ou autre suivant les raccourcis de l'application) pour fermer l'application. Sans passer par les API. A tester.
    - Quant aux bibliothèques Acrobate pour le VBA, je pense qu'elles ne sont plus utilisables dans les versions récentes de Acrobate, à vérifier aussi.

    Bonne continuation.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    comptabiltité
    Inscrit en
    Juin 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : comptabiltité

    Informations forums :
    Inscription : Juin 2021
    Messages : 6
    Par défaut
    Bonjour #laurent_ott

    Merci pour tes retours. J'ai finalement laissé tomber mes tentatives pour fermer acrobat. les employés le fermeront eux-mêmes ! c'est plus simple non ?!

    Merci encore pour tous ces éclaircissements par contre qui me permettent de comprendre un petit peu plus cette partie de code

Discussions similaires

  1. [XL-2013] Lancer une application tierce sur réseau via VBA Excel
    Par bugstar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/08/2018, 14h10
  2. [AC-2003] Fermer une application Excel
    Par flet le kid dans le forum Access
    Réponses: 5
    Dernier message: 27/04/2009, 10h16
  3. ouvrir une application en vba à partir d'excel
    Par Boubas1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2008, 01h19
  4. Lancement d'une application via vba
    Par sefir dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/10/2007, 12h00
  5. programmer une tâche via VBA/Excel
    Par simstef dans le forum Excel
    Réponses: 5
    Dernier message: 07/08/2007, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo