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:
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:
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:
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:
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 :love::heart: