Fermer une instance Excel masquée

GeoTrouvePas

XLDnaute Impliqué
Bonjour le forum !

J'ai un peu petit soucis que je n'arrive pas à résoudre malgré de nombreuses recherches.

A partir de mon classeur principal, j'ouvre un second classeur via une instance Excel masquée grâce au code suivant :
Code:
Set InstanceBase = CreateObject("Excel.Application")
InstanceBase.Visible = False
Set ClasseurBase = InstanceBase.Workbooks.Open(C:\Machin.xls))

Jusque là, tout va bien.... Là où je coince, c'est que j'aurai besoin d'une macro qui vérifie si ce second classeur est déjà ouvert. Du fait que Machin.xls est ouvert dans une seconde instance, qui plus est masquée, je ne peux pas me servir d'un
Code:
.Windows.Count

Est ce quelqu'un manipulerai suffisement les API Windows pour résoudre ça ?

Je vous remercie par avance de votre aide.

Bonne soirée à tous !
 

unrender

XLDnaute Junior
Re : Fermer une instance Excel masquée

Bonjour,

Pas besoin d'API normalement.
Cela devrait te suffir :

Code:
    Dim lWorkbook As Workbook
    Dim lFound As Boolean
    
    lFound = False
    For Each lWorkbook In Workbooks
        If lWorkbook.Name = "Machin.xls" Then
            lFound = True
            Exit For
        End If
    Next
    If lFound Then
        Application.DisplayAlerts = False
        Workbooks("Machin.xls").Close
        Application.DisplayAlerts = True
    End If
 

Pierrot93

XLDnaute Barbatruc
Re : Fermer une instance Excel masquée

Bonjour,

regarde ceci :
Code:
Dim InstanceBase As Application
Set InstanceBase = CreateObject("Excel.Application")
'ton code
InstanceBase.Quit
Set InstanceBase = Nothing
bonne journée
@+
 

GeoTrouvePas

XLDnaute Impliqué
Re : Fermer une instance Excel masquée

Bonjour Unrender, bonjour Pierrot et merci pour vos réponses.
Je constate malheureusement que j'ai oublié l'essentiel dans ma question. Veuillez m'en excuser.

Par rapport à ta réponse Pierrot, c'est tout à fait le code que j'utilise pour fermer mon instance masquée. Le soucis est qu'en cas de plantage du classeur principal, il peut arriver que l'instance masquée ne soit pas fermée. La variable InstanceBase ne sera donc plus utilisable au redémarrage du classeur.

Je voudrais donc faire une macro qui puisse rechercher les instances Excel masquées et les fermer sans avoir à se servir de la cette variable.

C'est pour ça que je me suis dit que l'utilisation d'une API Windows était indispensable.
 

Pierrot93

XLDnaute Barbatruc
Re : Fermer une instance Excel masquée

Re,

un exemple ci-dessous :
Code:
Option Explicit
Sub test()
Dim InstanceBase As Application
On Error GoTo fin
Set InstanceBase = CreateObject("Excel.Application")
Range("xxxxxxxx").Select
'ton code
Exit Sub
fin:
MsgBox "attention, horreur... " & Err.Number & vbCrLf & Err.Description
InstanceBase.Quit
Set InstanceBase = Nothing
End Sub
 

GeoTrouvePas

XLDnaute Impliqué
Re : Fermer une instance Excel masquée

Bonjour MJ13 et merci pour ce lien trés intéressant.

Sacré MJ, tu as décidément toujours un lien intéressant à balancer.

J'ai utilisé ton excellent code permettant de fermer IE.
Après adaptation, j'arrive à boucler sur toutes les instances Excel ouvertes.
L'embétant c'est que, dans la dernière boucle de ton code "objProcess" renvoi "EXCEL.EXE".

Donc deux solutions pour arriver à mes fins :
1) Trouver comment boucler sur les enfants d'objProcess, ce qui me permettrait de fermer Machin.xls
2) Trouver comment tester si objProcess est visible ou pas. Si il n'est pas visible, c'est un critère suffisant pour considérer qu'il s'agit bien de l'instance que j'avais ouverte et que je vais donc fermer. (j'ai bien essayé de tester objProcess.Visible mais bien évidemment, ça ne marche pas)

J'essaye de gratter un peu sur le net pour trouver des renseignements sur WMI Scripting Library mais je trouve pas grand chose d'intéressant.

Si quelqu'un a une idée, je suis preneur...

Edit : Merci Pierrot. J'ai déjà implanté une gestion d'erreur. L'embêtant c'est que, entre l'ouverture et la fermeture de l'instance masquée, j'ai des tonnes de procédures qui sont lancées. En fait mon fichier principal est énorme (30 userform, 650 procédures, 10 000 lignes de codes) donc difficile d'implanter une gestion d'erreur vraiment pertinente et 100% efficace dans tout ça. C'est pour ça qu'en cas de plantage, j'aurai aimé vérifier au redémarrage qu'une ancienne instance masquée n'était pas encore ouverte.
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Fermer une instance Excel masquée

Re

Code:
Sacré MJ, tu as décidément toujours un lien intéressant à balancer.
En plus avec les Like, c'est plus facile à retrouver ;).

Sinon, voici un fichier Vbs pour afficher Excel et Word. Peut-être une autre solution à creuser :).
 

Pièces jointes

  • excelaffiche.zip
    357 bytes · Affichages: 47
  • excelaffiche.zip
    357 bytes · Affichages: 44
  • excelaffiche.zip
    357 bytes · Affichages: 33

GeoTrouvePas

XLDnaute Impliqué
Re : Fermer une instance Excel masquée

Je progresse, je progresse !!!!

J'ai modifié ton script comme ceci :
Code:
Dim objXL, strMessage
On Error Resume Next
Set objXL = GetObject(, "Excel.Application")
If objXL.Visible = false then objXL.quit
sendkeys("~")

ça a l'air de fonctionner à merveille à conditionne toutefois qu'il tombe en premier sur ma fameuse instance masquée. Si une autre instance Excel a été ouverte avant, il n'arrive pas jusqu'à l'instance désirée (normal puisqu'il n'y a pas de boucle).

Pas si mal que ça pour mon premier script VB ^^.
Si quelqu'un a une idée pour implanter ça dans une boucle...

En plus avec les Like, c'est plus facile à retrouver ;).

Geo Like MJ13 ! ;)
 

GeoTrouvePas

XLDnaute Impliqué
Re : Fermer une instance Excel masquée

généralement plutôt source d'ennui qu'autre chose.... Enfin c'est juste mon avis...

A ton avis, pourquoi j'en suis à mon Xème message sur le forum aujourd'hui ? Parce que j'ai des ennuis !!! Ce n'est donc pas que ton avis, c'est également le mien ! ;)

Je passe par une instance masquée pour faire un peu plus "propre", pour que l'utilisateur ne voit pas ce qui se passe. C'est de la "fioriture" mais je suis content du résultat de mon application pour l'instant.

L'adaptation de ce script devrait être la dernière barrière à franchir avant la diffusion de mon application.
 

Pierrot93

XLDnaute Barbatruc
Re : Fermer une instance Excel masquée

Re,

Je passe par une instance masquée pour faire un peu plus "propre", pour que l'utilisateur ne voit pas ce qui se passe. C'est de la "fioriture" mais je suis content du résultat de mon application pour l'instant.

A noter que tu peux également travailler avec la fenêtre du classeur en question masquée et empêcher le rafraichissement d'écran....
Code:
Application.ScreenUpdating = False
'ton code
Application.ScreenUpdating = True

pour masquer la fenêtre :
Code:
    Windows("nomclasseur.xls").Visible = False
 

GeoTrouvePas

XLDnaute Impliqué
Re : Fermer une instance Excel masquée

A noter que tu peux également travailler avec la fenêtre du classeur en question masquée et empêcher le rafraichissement d'écran....
Code:
    Windows("nomclasseur.xls").Visible = False

Tu pouvais pas le dire plus tôt ????????????? :p

Il y a quelques mois de ça, j'ai passé des heures à chercher comment ouvrir un fichier dans la même instance et le masquer. J'en avais besoin car la copie d'onglets entre deux classeurs ne fonctionne pas s'ils ne sont pas dans la même instance. Personne n'avait su me répondre à l'époque. J'ai utilisé un sreenupdating mais l'ouverture est toujours visible dans la barre des taches.

Je vais immédiatement reporter ta technique sur mes procédures existantes, ça sera plus propre.

Merci.

Ma question sur le script Vbs est toujours d'actualité, si qqun a une idée.... :p
 

Statistiques des forums

Discussions
312 078
Messages
2 085 120
Membres
102 783
dernier inscrit
Basoje