XL 2013 Fermer un fichier pdf avec VBA

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

je cherche comment fermer un fichier .pdf depuis VBA

Mon code échoue avec le message :



Erreur d'exécution 9 - L'indice n'appartient pas à la sélection



Sub Fermer_fichier()

Chemin = ThisWorkbook.Path

Chemin_et_nom = ThisWorkbook.Path & "\Toto.pdf"

Windows("Chemin_et_nom").Close

End Sub



Au début, je pensais que c'était parce que je ne l'avais pas ouvert, mais

ça plante même quand le fichier pdf est ouvert …



Je sais comment tester si le fichier est bien présent mais pas

1) s'il est ouvert

2) comment le fermer



Quelqu'un a une idée ?



Merci d'avance

PS : désolé, tout à coup, je ne vois plus comment mettre en forme le texte (code, citations etc.) ...
 

Fichiers joints

herve62

XLDnaute Barbatruc
Bonsoir
Avec ton fichier qui ne fait .... rien , normal que cela ne va pas
Excel ne reconnait que des appli (logiciels) comme Word, Access , Acrobat etc
et pas des types de fichiers Excel peut fermer des Xls , WOrd des .doc etc . Là faut préciser quelle appli tu veux fermer , celle-ci étant un "Objet" donc un EXE qui forcément fermera ton fichier
Si tu avais un peu fouiné sur le Web en 5min tu aurais trouvé un départ de solution comme ceci :
https://forum.excel-pratique.com/viewtopic.php?t=63248
J'ai pas testé mais la 2eme propo me semble plus nette et rapide Vbs & Vba se rapprochent
Bonne continuation
 

job75

XLDnaute Barbatruc
Bonjour Sebast, herve62, le forum,

Téléchargez les fichiers joints dans le même répertoire (le bureau) et exécutez ces macros très simples :
Code:
Sub OuvrirPDF()
CreateObject("WScript.Shell").Run ThisWorkbook.Path & "\Toto.pdf"
End Sub

Sub FermerPDF()
CreateObject("WScript.Shell").Run "taskkill.exe /IM AcroRd32.exe /T /F", 0
End Sub
Elles fonctionnent très bien chez moi sur Win 10 - Excel 2013, je ne sais pas si c'est le cas pour toutes les versions.

Bonne journée.
 

Fichiers joints

Sebast

XLDnaute Impliqué
Bonjour Hervé62,

Merci pour ta réponse, je me suis effectivement rendu compte en validant mon post hier que les mots-clés de ma demande faisaient s’afficher sur ce même forum des discussions un peu similaires …



Bonjour job75,

Merci pour ces bouts de code, qui m’ont permis d’avancer.

Concernant l’ouverture du fichier pdf, votre code plante chez moi (je suis en excel 2013 windows 7)

avec le message « La méthode run de l’objet WScript.Shell a échoué »



J’ai regardé un peu partout et ai adapté comme suit, qui fonctionne nickel

Code:
Sub OuvrePDF()

  Dim Datei As String

  Datei = ThisWorkbook.Path & "\Toto.pdf"

  CreateObject("Shell.Application").Open (Datei)

End Sub


Concernant votre code pour fermer le pdf, il fonctionne mais en fait, je constate qu’il supprime le pdf (et du même coup le ferme)

Je cherchais un moyen de simplement le fermer et pas de le supprimer

J’ai essayé d’adapter le code mais ça plante … j’ai probablement naïvement remplacer Open par Close …

Code:
Sub FermePDF()

  Dim Datei As String

  Datei = ThisWorkbook.Path & "\Toto.pdf"

  CreateObject("Shell.Application").Close (Datei)

End Sub

Y a-t-il un moyen de juste fermer et non flinguer le pdf ?


Bonne journée
 

job75

XLDnaute Barbatruc
Concernant votre code pour fermer le pdf, il fonctionne mais en fait, je constate qu’il supprime le pdf (et du même coup le ferme)
Chez moi le fichier pdf (en fait l'application Acrobat) est supprimé de la barre des tâches mais pas du disque dur !!
 

Sebast

XLDnaute Impliqué
Je suis confus,



Ce n’est pas votre code mais un des miens, testé par moi (non affiché – j’ai confondu), qui ferme et supprime Toto.pdf !



Code:
Sub FichierExterneSuppr()

  Dim FichierASupprimer As String

  FichierASupprimer = ThisWorkbook.Path & "\Toto.pdf"


  Kill FichierASupprimer




End Sub


… désolé !



Cependant, de manière à mieux comprendre



CreateObject("WScript.Shell").Run "taskkill.exe /IM AcroRd32.exe /T /F", 0



J’ai essayé de chercher à quoi correspondaient /T /F", 0



mais sans succès …



où puis-je trouver des infos à ce sujet ? en avez-vous ?





encore merci
 

Sebast

XLDnaute Impliqué
re,
en fait c'est surtout pour pouvoir maintenir le code quand je change de version.
En utilisant

CreateObject("WScript.Shell").Run "taskkill.exe /IM AcroRd32.exe /T /F", 0

ça fonctionne parfaitement maintenant, mais quid d'Excel 2016 ou autre, à l'avenir.
Du coup, je cherche à savoir à quoi correspondent ces paramètres

merci
 

MJ13

XLDnaute Barbatruc
Bonjour à tous

Pour fermer un logiciel proprement, j'utilise souvent un code avec Sendkeys. Normalment on doit pouvoir aussi utiliser Alt+F4 avec SendKeys ("%{F4}"). Le problème, c'est que souvent cela ne fonctionne pas bien.

Exemple à adapter:

VB:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Ferme_FF()
Sleep 1000
Application.SendKeys ("%f"), True
Sleep 2000
Application.SendKeys ("q"), True
Sleep 1000
Application.SendKeys ("~"), True
Sleep 1000
End Sub
VB:
Sub Ferme_DOc_Alt_F4()
ActiveWorkbook.FollowHyperlink ("C:\Chemin\NomFichier.docx")
Sleep 3000
Application.SendKeys ("%{F4}"), True
End Sub
 
Dernière édition:

Sebast

XLDnaute Impliqué
Re,


Merci pour le lien vers taskkill, je vais m’y plonger.


J’avoue n’avoir jamais utilisé les sendkeys …

Si c’est capricieux d’une version à l’autre, je préfère ne pas me pencher sur ce cas


En revanche, je me demande pourquoi si OpenPDF fonctionne


Code:
Sub OpenPDF()

  Dim Datei As String

  Datei = ThisWorkbook.Path & "\Toto.pdf"

  CreateObject("Shell.Application").Open (Datei)

End Sub




alors pourquoi ClosePDF plante, bien que construit sur le même modèle



Code:
Sub ClosePDF()

  Dim Datei As String

  Datei = ThisWorkbook.Path & "\Toto.pdf"

  CreateObject("Shell.Application").Close (Datei)

End Sub


Pourquoi dans un cas la méthode Open fonctionne mais pas la méthode Close ?



Avez-vous une idée ?
 

MJ13

XLDnaute Barbatruc
Re

Pour moi, Sendkeys, quand cela fonctionne, c'est très robuste. On peut aussi simuler le déplacement de la souris et le click.

Sinon, ont peut aussi utiliser une alternative comme Super Macro et là plus de problèmes, mais il faudra faire du Shell. :)
 

Sebast

XLDnaute Impliqué
Bonjour Michel,
merci pour ces précisions; je n'ai malheureusement jamais utilisé les sendkeys et ne saurai donc pas donner mon avis ...

Tu évoques l'alternative consistant à devoir utiliser SHELL : à ce propos, as-tu une idée pourquoi la méthode Open fonctionne alors que Close conduit à un plantage (voir mon dernier post #12) ?
 

MJ13

XLDnaute Barbatruc
Re

Bonjour Michel,
merci pour ces précisions; je n'ai malheureusement jamais utilisé les sendkeys et ne saurai donc pas donner mon avis ...

Tu évoques l'alternative consistant à devoir utiliser SHELL : à ce propos, as-tu une idée pourquoi la méthode Open fonctionne alors que Close conduit à un plantage (voir mon dernier post #12) ?
Le problème, c'est qu'on ne sait pas comment tu ouvres ton PDF.

Par exemple chez moi ton PDF, je l'ouvre avec Edge.

Pour le fermer je peux utiliser ce code. Sinon, il suffit de remplacer MicrosoftEdge par le nom de l'application que tu trouveras en allant dans le gestionnaire de tâche (Ctrl+Alt+Suppr.).

VB:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Kill_process()
'Sleep 1000
killString = "taskkill /F /IM MicrosoftEdge.exe"
'killString = "taskkill /F /IM firefox.exe"
'Sleep 1000
Call Shell(killString, vbHide)
'Sleep 1000
End Sub
 

Discussions similaires


Haut Bas