XL 2019 Fermer fichier PDF si ouvert avant impression

gilboss

XLDnaute Nouveau
Bonjour,

J'ai un petit soucis. J'ai la possiblité de créer un fichier PDF nommé, mais si celui-ci existe déjà et s'il est ouvert, j'ai un message d'erreur.
Voici mes ligne VBA qui fonctionnent parfaitement bien si le fichier est fermé, dans ce cas il est écrasé, ou il est créer s'il n'existe pas.
sFilename = ThisWorkbook.Name
sFilename = "Garde " & Range("01!Y15") & (" ") & Range("01!C85") & (" ") & Range("01!E83") & (".pdf")

ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=sRep & sFilename, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True

Est-il possible d'insérer un ligne VBA avant impression pour vérifier si ce fichier est ouvert et le fermer le cas échéant ?

Merci à vous
 

patricktoulon

XLDnaute Barbatruc
re
ben c'est simple
je fouille un peu dans mes vieux VBS (les bon vieux truc a bibi)
et je te fait ça pour vba
ferme toute application Acrobat ouvertes

pour tester ouvrez un pdf avec votre acrobat reader (n'importe quelle version)
et lancez cette sub
VB:
Sub CloseAllAppPDF()
    Dim process
    Set objWMI = GetObject("winmgmts:root\cimv2")
    sQuery = "Select * from Win32_process"
    For Each process In objWMI.execquery(sQuery)
        If InStr(1, process.Name, "Acrobat") Then process.Terminate
    Next
    Set objWMI = Nothing
End Sub

et oui ca a du bon les vieux trucs ;)
je viens de tester ça fonctionne toujours

maintenant sur window10 il arrive que certains n'ont pas d'app pdf reader
il se servent de edge ou FF ou chrome
je suppose que je vais bien trouver un truc en listant les fenetre avec les api et l'api sendmessage pour close la fenêtre
LOL
 

gilboss

XLDnaute Nouveau
re
ben c'est simple
je fouille un peu dans mes vieux VBS (les bon vieux truc a bibi)
et je te fait ça pour vba
ferme toute application Acrobat ouvertes

pour tester ouvrez un pdf avec votre acrobat reader (n'importe quelle version)
et lancez cette sub
VB:
Sub CloseAllAppPDF()
    Dim process
    Set objWMI = GetObject("winmgmts:root\cimv2")
    sQuery = "Select * from Win32_process"
    For Each process In objWMI.execquery(sQuery)
        If InStr(1, process.Name, "Acrobat") Then process.Terminate
    Next
    Set objWMI = Nothing
End Sub

et oui ca a du bon les vieux trucs ;)
je viens de tester ça fonctionne toujours

maintenant sur window10 il arrive que certains n'ont pas d'app pdf reader
il se servent de edge ou FF ou chrome
je suppose que je vais bien trouver un truc en listant les fenetre avec les api et l'api sendmessage pour close la fenêtre
LOL
Ca marche très bien. Merci.
 

patricktoulon

XLDnaute Barbatruc
Bonjour @kiki29
cells ci ferme le pdf avec une partie du texte de la barre de titre
fonctionne pour acrobat et firefox
VB:
Option Explicit
'déclaration VBA7 en 32/64 bits
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal HWND As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare PtrSafe Function GetWindow Lib "user32" (ByVal HWND As LongPtr, ByVal wCmd As Long) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32" (ByVal HWND As LongPtr, ByVal wMsg As LongPtr, ByVal wParam As Integer, ByVal lParam As LongPtr) As LongPtr

Private Const WM_SYSCOMMAND As Long = &H112
Private Const WM_CLOSE As Long = &H10
Private Const GW_HWNDNEXT As Long = 2


Sub test()

'le pdf s'appelle : "actualité MSN beau arts janvier xxxxxxxxxxx.pdf"

'FindAndcloseWindoWByPartTitle "*actu*janvier*.pdf", "Firefox"    'si PDF ouvert avec firefox
'<<<<< attention!!!! si le pdf n'est pas la seul page ouverte dans Firefox   c'est tout Firefox qui est fermé !!!!>>>>>


'FindAndcloseWindoWByPartTitle "*actu*janvier*.pdf", "Acrobat" 'si PDF ouvert avec Acrobat reader (DC ou pas) (toutes versions
   
   
   
    FindAndcloseWindoWByPartTitle "*actu*janvier*.pdf"    'si PDF ouvert avec  Firefox ou Acrobat reader (DC ou pas) (toutes versions
End Sub

Sub FindAndcloseWindoWByPartTitle(Optional partTittle As String, Optional PartApp As String)
    Dim sStr As String, HWND As LongPtr
    sStr = Space$(300)
    HWND = FindWindow(vbNullString, vbNullString)
    Do While HWND <> 0
        GetWindowText HWND, sStr, 300
        If sStr Like "*" & partTittle & "*" & PartApp & "*" Then
            SendMessageA HWND, WM_CLOSE, 0, 0
            Exit Do
        End If
        HWND = GetWindow(HWND, 2)
    Loop
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 088
Messages
2 116 089
Membres
112 657
dernier inscrit
jpb3