Fermeture d'Excel sous VB6

Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008 - 7 mars 2008 à 20:07
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008 - 8 mars 2008 à 18:27
Bonjour,

J'ai un problème lors de la fermeture de mon application Excel depuis VB6. En effet, je quitte l'application et celle-ci est toujours présente dans mon gestionnaire des tâches. Je ne peux donc pas relancer un traitement sinon Erreur 1004: " La méthode 'Range' de l'objet '_Global' a échoué ".

Si je tue l'application Excel dans le gestionnaire des tâches avant de relancer mon application j'obtiens encore une erreur d'exécution mais du type 462 cette fois-ci: " Le serveur distant n'excite pas ou n'est pas disponible "

Par contre si j'effectue un traitement, je quitte mon application VB: Excel n'apparait plus dans le gestionnaire des tâches. J'avoue ne pas tout comprendre

Voici mon code:

OUVERTURE DE L'APPLICATION:

Dim W_FichierExcelEntree As Excel.Application
Dim W_xlBookStat As Excel.Workbook

'Ouverture de l'application
Set W_FichierExcelEntree = New Excel.Application

' Ouverture des classeurs pour traitement
W_FichierExcelEntree.Workbooks.Open W_cheminEntree & "\CalibrationReduit.xls"
W_FichierExcelEntree.Workbooks.Open W_cheminEntree & "\Pass_PredictReduit.xls"

' Ajout d'un nouveau classeur
Set W_xlBookStat = W_FichierExcelEntree.Workbooks.Add

' TRAITEMENT .............

FERMETURE DE L'APPLICATION:

W_FichierExcelEntree.Workbooks(3).Close True, W_cheminSortie & "\Pass_Predict.xls"
W_FichierExcelEntree.Workbooks(2).Close True, W_cheminSortie & "\Statistique.xls"
W_FichierExcelEntree.Workbooks(1).Close True, W_cheminSortie & "\Calibration.xls"

'Fermeture de l'application
W_FichierExcelEntree.Quit

' Libération des références
Set W_xlBookStat = Nothing
Set W_FichierExcelEntree = Nothing


Voila. Merci pour vos réponces.

Dernière précision, ma fermeture et mon ouverture d'excel ce trouve dans des fonctions distinctes qui sont appelées depuis le from_activate de ma feuille.

11 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 mars 2008 à 23:54
Dernière précision, ma fermeture et mon ouverture d'excel ce trouve
dans des fonctions distinctes qui sont appelées depuis le from_activate
de ma feuille.



C'est probablement là le problème. Si tu crées ton instance Excel dans le Activate, à chaque fois que tu passeras à une autre feuille et que tu reviendras à cette feuille d'initialisation, une instance sera créée et peut-être pas nécessairement fermée...

Tu devrais créer ton instance dans le Form_Load et la fermer dans le Form_Unload ou Query_Unload. Si tu dois la fermer autrement ou avant de quitter l'application VB, tu pourrais choisir un autre endroit... à toi de voir. Mais pour ce qui est de la création de l'instance Excel, je pense vraiment que tu devrais utiliser Form_Load.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 11:07
C'est ce que je pense aussi... Mais voila, j'ai ma feuille principale: lorsque je click sur le bouton traitement une deuxième feuille s'ouvre avec une progressBar un label et un bouton annuler pour gérer mon traitement Excel.

Le probléme est que si je met mon code dans le from load de ma feuille celle-ci ne s'affichera pas car une fois le traitement terminé je décharge imédiatement la feuille c'est pour cela que j'avais choisi le from_activate).... Tu aurais une Idée ?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
8 mars 2008 à 11:28
Tu pourrais déclarer tes variables en Public dans un module
    Public W_FichierExcelEntree As Excel.Application

    Public W_xlBookStat As Excel.Workbook

Pour le reste, ce n'est pas très clair... Tu parles de feuilles mais tu ne précises pas de laquelle tu parles... Je pense que si tu démarres ton code sur click d'un bouton, tu pourrais démarrer ton traitement en créant tes instances, utiliser DoEvents pour permettre l'affichage de ta feuille "Progress", et détruire tes variables et fermer ton application Excel lors de la fermeture de cette feuille "Progress" ou sur click de son bouton "Annuler".

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 11:50
J'ai deux Feuilles: Une Principale sur laquelle je choisis divers paramètres pour mon traitement. Sur cette feuille, j'ai placer un bouton de Traitement. Lors de l'événement click de mon bouton j'ouvre une deuxiéme feuille ( F_Traitement.show 1) qui lance mon application Excel.

Voila le code à l'ouverture de ma feuille de traitement:

Private Sub form_activate()

' Annulation du traitement impossible tant que Excel n'est pas lancer
CMD_AnnulationTraitement.Enabled = False
W_AnnulerTraitement = False

' Configuration de la barre de progression
PRG_Traitement.Min = 0
PRG_Traitement.Max = 10
PRG_Traitement.Value = 1
LBL_EtatChargement(0).Caption = "Ouverture de l'application Excel"

' Appel des fonctions relative au Traitement
Call FCT_OuvertureApplication
If Not (W_AnnulerTraitement) Then Call FCT_Traitement
Call FCT_FermetureApplication

F_Chargement.Hide
Unload Me

End Sub

Mes variables Excel son déclarer en Global sur ma feuille.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 11:58
Si j'utilise le from_Load et from_Unload:

Private Sub form_load()

' Annulation du traitement impossible tant que Excel n'est pas lancer
CMD_AnnulationTraitement.Enabled = False
W_AnnulerTraitement = False

' Configuration de la barre de progression
PRG_Traitement.Min = 0
PRG_Traitement.Max = 10
PRG_Traitement.Value = 1
LBL_EtatChargement(0).Caption = "Ouverture de l'application Excel"
DoEvents
' Appel des fonctions relative au Traitement
Call FCT_OuvertureApplication
If Not (W_AnnulerTraitement) Then Call FCT_Traitement

Unload Me

End Sub

Private Sub Form_Unload(Cancel As Integer)

Call FCT_FermetureApplication
F_Chargement.Hide

End Sub

L'application Excel se ferme correctement mais F_Traitement.Show 1 dans ma feuille principale n'est pas exécuter car ma feuille ce charge à l'ouverture d'excel et de se décharge imédiatement à la fermeture.

Il me faut un code dans mon from_load qui affiche ma feuille (DoEvents ne marche pas pour l'affichage d'une feuille VB).
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
8 mars 2008 à 12:06
DoEvents devrait fonctionner, mais tu devras probablement l'inscrire à plusieurs endroits. Dans le Form_Load, mais aussi dans les différents traitements et/ou boucles...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 mars 2008 à 12:58
salut,

pourquoi tu ne passes pas juste par une classe public.
première init (booléen), tu initialises normalement, et aux autres appels "non désirés" la classe ne fait pas de traitement ou ferme les instances ou ce que tu veux.... ?

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 16:27
J'ai deja utiliser les DoEvents pour gérer mon bouton Annulation, la n'est pas le probléme... mon application marche très bien. Je vais effectivement utiliser une classe Public, je pense que c'est la meilleur solution. Je vous tiens au courent.

Merci encore pour vos conseils.
0
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 17:40
En faite sa ne me va pas non plus. Je m'explique, lorsque je fait mon traitement Excel, j'affiche différente information sur mon label, je fais avancer ma barre de progression, ... . Si je passe par une classe public je perd toute ces information car LBL_Traitement.caption par exemple ne sera pas reconnu dans ma classe car il appartient à ma feuille de traitement.

J'ai trouver une autre solution pour afficher ma feuille depuis le Form_Load: F_Traitement.Visible = True. Mais même en utilisant les procédure Load et Unload à la place d' Activate, mon application Excel est toujour présente dans mon gestionnaire des tâches !!??
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 mars 2008 à 18:04
LBL_Traitement.caption par exemple ne sera pas reconnu




heureusement, c'est le principe même de la classe...
à elle de renvoyer un évènement

public dans le module
private withevents dans la form qui contient le label

set la_private = la_public dans le load de ta form
et à l'évènement tu affiches dans le label
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
Lunikmarty Messages postés 55 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 17 avril 2008
8 mars 2008 à 18:27
Merci pour l'astuce, je vais essayé cela tous de suite. Juste une petite précision: apparemment mon probléme n'a rien a voir avec le fait que mon ouverture/fermeture se trouve dans le form_activate de ma feuille car j'ai copié mon code dans un autre projet et je l'ai mis directement dans l'événement click d'un bouton.

>> Même effet, Excel ne s'est pas fermé... il doit y avoir une petite erreur dans ma source, mais ou ?? Là est la question.

Encore merci pour votre aide.
0
Rejoignez-nous