Fermer excell depuis access [Résolu]

Signaler
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007
-
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007
-
Bonjour à toutes et tous,

Depuis access 2002, j'importe automatiquement  des fichiers excell mais hélas, parfois, à cause de la présentation d'un fichier excell, le système se plante.
Hélas, le fichier excell a été ouvert et il le reste.
Je dois alors avoir recours au CTRL + alt + delete pour aller fermer excell.exe
Quelqu'un connaît il le code à placer sur un seul bouton pour le faire en évitant toutes les commandes manuelles
Merci d'avance.
JL

16 réponses

Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

VOICI LA REPONSE DE Jean-Marc ( JMO ) qui marche très bien sauf que  c'est objProcess.Terminate   sans les ()
Merci JMO !

******************************
Avec inputbox:

'Arrêt d'un Process
MyProcess = InputBox(vbCrLf&vbCrLf&"Mettre le service à arrêter"_
            &vbCrLf&"Ex: excel","Arrêt du ou des processes", "excel")
strComputer "." : compteur 0
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\" _
    & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name =  '" & MyProcess & ".exe'")
For Each objProcess in colProcessList
    'MsgBox objProcess.Name &vbCrLf& " id:" & objProcess.ProcessID
    objProcess.Terminate()
    compteur = compteur + 1
NextSet objWMIService = Nothing
Set colProcessList = Nothing
MsgBox vbCrLf&vbCrLf& compteur & " service(s) " & MyProcess &_
       " arrêté(s)",,"script terminé"

jean-marc
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
 Bonjour à tous....

salut jean-luc,
Encore moi,
en vb6, il y a kill.....

sinon:
'Arrêt d'un Process
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\" _
    & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'EXCEL.exe'")
For Each objProcess in colProcessList
    MsgBox objProcess.Name &vbCrLf& " id:" & objProcess.ProcessID
    objProcess.Terminate()
Next



Set objWMIService = Nothing
Set colProcessList = Nothing


jean-marc
Messages postés
41
Date d'inscription
dimanche 13 février 2005
Statut
Membre
Dernière intervention
14 décembre 2006

un problème similaire m'est déja arrivé. Par contre, adopter directement la solution de Jean-marc me pose un peu problème, car si l'utilisateur a déja lancé Excel avant mon application, je vais tout killer et je suis pas sur que cela soit apprécié . Donc y a t'il un moyen de killer seulement les processus qui sont des fils de mon application (en gardant d'une manière ou d'une autre leur pid ou je ne sais quoi d'autre...)
Messages postés
41
Date d'inscription
dimanche 13 février 2005
Statut
Membre
Dernière intervention
14 décembre 2006

un problème similaire m'est déja arrivé. Par contre, adopter directement la solution de Jean-marc me pose un peu problème, car si l'utilisateur a déja lancé Excel avant mon application, je vais tout killer et je suis pas sur que cela soit apprécié . Donc y a t'il un moyen de killer seulement les processus qui sont des fils de mon application (en gardant d'une manière ou d'une autre leur pid ou je ne sais quoi d'autre...)
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
 Re,

Effectivement, Fianchetto  , objProcess.Terminate() s'effectue pour
tous les processes "excel.exe".

Le problème de jean-luc est qu'il est en période de "grands" tests,
 répétés x fois (casssssssséééééé le jean-luc).
Ses fichiers excel ne se ferment pas et les objets utilisés ne sont pas supprimés.
Celà l'évitera de passer manuellement par le gestionnaire de tâches.
Il doit, certainement, bosser sur son poste local et non sur un server de prod.

Donc, en test, il peut rajouter un bouton avec le code proposé
en y ajoutant une inputbox pour le nom du service à supprimer.

jean-marc
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
 Re,

Avec inputbox:

'Arrêt d'un Process
MyProcess = InputBox(vbCrLf&vbCrLf&"Mettre le service à arrêter"_
            &vbCrLf&"Ex: excel","Arrêt du ou des processes", "excel")
strComputer "." : compteur 0
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\" _
    & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name =  '" & MyProcess & ".exe'")
For Each objProcess in colProcessList
    'MsgBox objProcess.Name &vbCrLf& " id:" & objProcess.ProcessID
    objProcess.Terminate()
    compteur = compteur + 1
Next



Set objWMIService = Nothing
Set colProcessList = Nothing
MsgBox vbCrLf&vbCrLf& compteur & " service(s) " & MyProcess &_
       " arrêté(s)",,"script terminé"





jean-marc
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour à tous,
Salut Jean-Marc, 
Salut  Fianchetto  ,

Effectivement, comme dit JMO, je suis en période de grands tests et c'est énervant de devoir passer par 36 clics pour simplement fermer excell. JMO a déjà contribué pas mal à mon projet.
Et je ne veux surtout pas "killer" les fichiers.
Je vais tester et je vous tiens au courant.

Un tout grand merci à vous deux.
Bonne soirée,
JL
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Re bonjour Jean-Marc,

J'ai essayé ton code,  et j'obtiens un message d'erreur (surbrillance ) sur

'MsgBox objProcess.Name &vbCrLf& " id:" & objProcess.ProcessID
    objProcess.Terminate()

et sur 
Set colProcessList = Nothing
MsgBox vbCrLf&vbCrLf & compteur & " service(s) " & MyProcess & " arrêté(s)",,"script

Merci
JL
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Si tu ouvres tes fichiers avec New Excel.Application ou CreateObject(....

Tu peux gérer les erreurs

On error goto Erreur

...

ton code...

....

Exit sub

Erreur:

    ObjExcel.Quit

    Set objExcel = Nothing

Normalement, ça devrait terminer la session Excel que tu as démarrée, non ?

Tu pourrais même mettre un MsgBox  avec vbYesNo pour demander si tu fermes ou non la session.

Faut dire que je n'ai pas tout suivi depuis le début...

MPi
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour à tous,
Salut MPI,

Ta solution, ok si tout se passe bien quoique çà devrait être superflu.
Mon problème, c'est quand la séquence plante et qu'un fichier excell avait été ouvert. Il faut la terminer via ctrl + alt+delete, et j'aurais voulu trouver une commande à placer dans le formulaire pour le faire via un bouton.
Merci, bonne journée.
JL
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
 Bonjour à tous....

Salut jean-luc,
En vb6,  il faut peut-être déclarer les composants de wmi ???
Ce n'est pas la 1ère fois que je propose un code s'y appuyant...
wmi est complexe mais très intéressant.

jean-marc
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Peut-être que je saisis mal, mais si l'application Access plante lors d'une manipulation avec Excel (ou autre, éventuellement), ça devrait te générer une erreur dans une procédure, non ?
Et dans la gestion de cette erreur, tu peux fermer tes objets qui pointent vers le ou les classeurs que tu as ouverts par code. Il ne devrait donc plus y avoir de session Excel ouverte par la suite.

MPi
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour MPI,

Effectivement, lors du plantage, j'ai un message d'erreur,


"erreur d'exécution 1004"      fin    débogage


Je clic fin mais le excell.exe  est toujours ouvert et je dois faire ctrl+alt+delete pour aller le fermer.
Merci pour ton intervention
Bonne journée
JL


 
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Plutôt que faire FIN, tu devrais faire débogage et voir d'où provient l'erreur. Il est possible que tu doives faire F8 plusieurs fois pour te rendre à la ligne en défaut.

À ce moment, tu places une gestion d'erreur dans la procédure en cause.
En début de procédure:
On error goto Erreur

En fin de procédure:
Exit sub  'ou Function selon le cas
Erreur:
    If err.Number = 1004 then
        msgbox Err.number & vbcrlf & err.description  'pas nécessaire mais bon...
       'ou Msgbox "L'application Excel va se terminer. Il faudra recommencer"

        objExcel.Quit  'Fermeture de la session
        set objExcel = Nothing
    End if
End sub

En principe, ça devrait régler le problème

MPi
Messages postés
134
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
1 juin 2007

Bonjour,

Oui, tout à fait d'accord, mais vu le nombre d'erreurs possibles dans mes fichiers, je ne saurais pas prévoir toutes les erreurs  et leur gestion.
C'est pour çà que je souhaitais un truc basique.
Merci quand même
JL
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
La gestion d'erreur, c'est un truc basique

C'est certain qu'il peut y avoir plusieurs types d'erreurs, mais il arrive souvent avec Excel que l'erreur 1004 survienne. Comme tu es en développement, tu dois t'apercevoir de ces erreurs et tenter de les corriger, mais si tu ne veux pas devoir tout fermer et utiliser Ctrl-Alt-Del à chaque fois, ça peut être intéressant.

MPi