OVH Cloud OVH Cloud

fermeture liaison excel

11 réponses
Avatar
Yann
Bonjour,

Je d=E9veloppe un programme en VB qui, pour effectuer des=20
calculs, utilise r=E9guli=E8rement un fichier Excel (dans=20
lequel j'entre des valeurs et dans lequel je r=E9cup=E8re mes=20
r=E9sultats).

J'utilise pour ouvrir et fermer Excel 2 fonctions (cf ci=20
apr=E8s), mais j'ai un probl=E8me de fermeture d'Excel qui ne=20
se ferme pas toujours (le processus reste dans le=20
gestionnaire des t=E2ches).
Je ne comprends vraiment pas pourquoi Excel se ferme mal,=20
si c'est parce que je l'ouvre et le ferme plusieurs fois=20
de suite, si c'est =E0 cause d'une liaison dans ce classeur,=20
si c'est mon code qui est faux (faut-il faire =E0 chaque=20
fois =AB exl2.Close SaveChanges:=3DFalse =BB , =AB=20
appex2.Quit" , =AB Set exl2 =3D Nothing =BB et =AB Set appex2 =3D=20
Nothing =BB ? )

Sub ouvreexcel2()

fermeexcel2 'ferme excel
Set appex2 =3D CreateObject("excel.Application")
nomfich2 =3D App.Path & "\Excelfiles\ParamCF.xls"
Set exl2 =3D appex2.Workbooks.Open(nomfich2, 0,=20
True, , , , , , , , False)

End Sub

Sub fermeexcel2()

On Error GoTo ges1

exl2.Close SaveChanges:=3DFalse
appex2.Quit
Set exl2 =3D Nothing
Set appex2 =3D Nothing
ges1:
Err.Clear
Resume Next

End Sub


Je me suis =E9galement dit qu'il pouvait y avoir plusieurs=20
instances de mon fichier Excel ouvertes, alors j'ai essay=E9=20
ceci mais =E7a ne marche pas non plus.

For Each w In appex2.Workbooks
Debug.Print w.Name
appex2.Workbooks(w.Name).Close SaveChanges:=3DFalse
Next w

Merci d'avance pour votre aide.
Yann

10 réponses

1 2
Avatar
msillienne
bonjour,
moi je fait comme ca et ca marche super bien
' adéclarer au tout début du programme
public xls as excel.application

dans le form_load()
xls.workbooks.open(nomfichier)

dans le unload
set xls = nothing

si ce n'est pas claire je t'enverrais ce soir le code exact
bonne chance

-----Message d'origine-----
Bonjour,

Je développe un programme en VB qui, pour effectuer des
calculs, utilise régulièrement un fichier Excel (dans
lequel j'entre des valeurs et dans lequel je récupère mes
résultats).

J'utilise pour ouvrir et fermer Excel 2 fonctions (cf ci
après), mais j'ai un problème de fermeture d'Excel qui ne
se ferme pas toujours (le processus reste dans le
gestionnaire des tâches).
Je ne comprends vraiment pas pourquoi Excel se ferme mal,
si c'est parce que je l'ouvre et le ferme plusieurs fois
de suite, si c'est à cause d'une liaison dans ce


classeur,
si c'est mon code qui est faux (faut-il faire à chaque
fois « exl2.Close SaveChanges:úlse » , «
appex2.Quit" , « Set exl2 = Nothing » et « Set appex2 =
Nothing » ? )

Sub ouvreexcel2()

fermeexcel2 'ferme excel
Set appex2 = CreateObject("excel.Application")
nomfich2 = App.Path & "ExcelfilesParamCF.xls"
Set exl2 = appex2.Workbooks.Open(nomfich2, 0,
True, , , , , , , , False)

End Sub

Sub fermeexcel2()

On Error GoTo ges1

exl2.Close SaveChanges:úlse
appex2.Quit
Set exl2 = Nothing
Set appex2 = Nothing
ges1:
Err.Clear
Resume Next

End Sub


Je me suis également dit qu'il pouvait y avoir plusieurs
instances de mon fichier Excel ouvertes, alors j'ai


essayé
ceci mais ça ne marche pas non plus.

For Each w In appex2.Workbooks
Debug.Print w.Name
appex2.Workbooks(w.Name).Close SaveChanges:úlse
Next w

Merci d'avance pour votre aide.
Yann

.



Avatar
Yann
Bonjour,

Merci de ton aide mais dans mon programme ça ne marche pas, ce n'est pas
très compréhensible mais si tu as une idée merci d'avance.

Yann

"msillienne" wrote:

bonjour,
moi je fait comme ca et ca marche super bien
' adéclarer au tout début du programme
public xls as excel.application

dans le form_load()
xls.workbooks.open(nomfichier)

dans le unload
set xls = nothing

si ce n'est pas claire je t'enverrais ce soir le code exact
bonne chance

>-----Message d'origine-----
>Bonjour,
>
>Je développe un programme en VB qui, pour effectuer des
>calculs, utilise régulièrement un fichier Excel (dans
>lequel j'entre des valeurs et dans lequel je récupère mes
>résultats).
>
>J'utilise pour ouvrir et fermer Excel 2 fonctions (cf ci
>après), mais j'ai un problème de fermeture d'Excel qui ne
>se ferme pas toujours (le processus reste dans le
>gestionnaire des tâches).
>Je ne comprends vraiment pas pourquoi Excel se ferme mal,
>si c'est parce que je l'ouvre et le ferme plusieurs fois
>de suite, si c'est à cause d'une liaison dans ce
classeur,
>si c'est mon code qui est faux (faut-il faire à chaque
>fois « exl2.Close SaveChanges:úlse » , «
>appex2.Quit" , « Set exl2 = Nothing » et « Set appex2 =
>Nothing » ? )
>
>Sub ouvreexcel2()
>
>fermeexcel2 'ferme excel
>Set appex2 = CreateObject("excel.Application")
>nomfich2 = App.Path & "ExcelfilesParamCF.xls"
>Set exl2 = appex2.Workbooks.Open(nomfich2, 0,
>True, , , , , , , , False)
>
>End Sub
>
>Sub fermeexcel2()
>
>On Error GoTo ges1
>
>exl2.Close SaveChanges:úlse
>appex2.Quit
>Set exl2 = Nothing
>Set appex2 = Nothing
>ges1:
>Err.Clear
>Resume Next
>
>End Sub
>
>
>Je me suis également dit qu'il pouvait y avoir plusieurs
>instances de mon fichier Excel ouvertes, alors j'ai
essayé
>ceci mais ça ne marche pas non plus.
>
>For Each w In appex2.Workbooks
>Debug.Print w.Name
> appex2.Workbooks(w.Name).Close SaveChanges:úlse
>Next w
>
>Merci d'avance pour votre aide.
>Yann
>
>.
>



Avatar
Quasimodo
Yann explained on 10/11/2004 :
Bonjour,

Je développe un programme en VB qui, pour effectuer des
calculs, utilise régulièrement un fichier Excel (dans
lequel j'entre des valeurs et dans lequel je récupère mes
résultats).

J'utilise pour ouvrir et fermer Excel 2 fonctions (cf ci
après), mais j'ai un problème de fermeture d'Excel qui ne
se ferme pas toujours (le processus reste dans le
gestionnaire des tâches).
Je ne comprends vraiment pas pourquoi Excel se ferme mal,
si c'est parce que je l'ouvre et le ferme plusieurs fois
de suite, si c'est à cause d'une liaison dans ce classeur,
si c'est mon code qui est faux (faut-il faire à chaque
fois « exl2.Close SaveChanges:úlse » , «
appex2.Quit" , « Set exl2 = Nothing » et « Set appex2 =
Nothing » ? )

Sub ouvreexcel2()

fermeexcel2 'ferme excel
Set appex2 = CreateObject("excel.Application")
nomfich2 = App.Path & "ExcelfilesParamCF.xls"
Set exl2 = appex2.Workbooks.Open(nomfich2, 0,
True, , , , , , , , False)

End Sub

Sub fermeexcel2()

On Error GoTo ges1

exl2.Close SaveChanges:úlse


!!à l'ordre des set nothing
Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing
ges1:
Err.Clear
Resume Next

End Sub


Je me suis également dit qu'il pouvait y avoir plusieurs
instances de mon fichier Excel ouvertes, alors j'ai essayé
ceci mais ça ne marche pas non plus.

For Each w In appex2.Workbooks
Debug.Print w.Name
appex2.Workbooks(w.Name).Close SaveChanges:úlse
Next w

Merci d'avance pour votre aide.
Yann


Bonjour,
Attention, à l'ordre dans lequel vous enlevé des instances de vos
objets.
En 1er lieux vos feuilles ensuite votre application : set exl2 =
nothing ensuite le quit ensuite le set nothing de votre référence sur
excel.
Pour vous aidez utiliser le windows task manger pour traker
l'instanciation (de excel bien sur et non pas de ces sous objets) et
sont déréférencement.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Patrice Henrio
Est-ce vraiment obligatoire de faire les calculs dans Excel au lieu de les
faire dans VB ?
Je pense qu'il y aurait un gain de temps et de résultat de cette façon.
Un exemple de ce que vous faites comme calcul permettrait sans doute de
traiter mieux votre problème.



"Quasimodo" a écrit dans le message de news:

Yann explained on 10/11/2004 :
Bonjour,

Je développe un programme en VB qui, pour effectuer des calculs, utilise
régulièrement un fichier Excel (dans lequel j'entre des valeurs et dans
lequel je récupère mes résultats).

J'utilise pour ouvrir et fermer Excel 2 fonctions (cf ci après), mais
j'ai un problème de fermeture d'Excel qui ne se ferme pas toujours (le
processus reste dans le gestionnaire des tâches).
Je ne comprends vraiment pas pourquoi Excel se ferme mal, si c'est parce
que je l'ouvre et le ferme plusieurs fois de suite, si c'est à cause
d'une liaison dans ce classeur, si c'est mon code qui est faux (faut-il
faire à chaque fois « exl2.Close SaveChanges:úlse » , « appex2.Quit" ,
« Set exl2 = Nothing » et « Set appex2 = Nothing » ? )

Sub ouvreexcel2()

fermeexcel2 'ferme excel
Set appex2 = CreateObject("excel.Application")
nomfich2 = App.Path & "ExcelfilesParamCF.xls"
Set exl2 = appex2.Workbooks.Open(nomfich2, 0, True, , , , , , , , False)

End Sub

Sub fermeexcel2()

On Error GoTo ges1

exl2.Close SaveChanges:úlse


!!à l'ordre des set nothing
Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing
ges1:
Err.Clear
Resume Next

End Sub


Je me suis également dit qu'il pouvait y avoir plusieurs instances de mon
fichier Excel ouvertes, alors j'ai essayé ceci mais ça ne marche pas non
plus.

For Each w In appex2.Workbooks
Debug.Print w.Name
appex2.Workbooks(w.Name).Close SaveChanges:úlse
Next w

Merci d'avance pour votre aide.
Yann


Bonjour,
Attention, à l'ordre dans lequel vous enlevé des instances de vos objets.
En 1er lieux vos feuilles ensuite votre application : set exl2 = nothing
ensuite le quit ensuite le set nothing de votre référence sur excel.
Pour vous aidez utiliser le windows task manger pour traker
l'instanciation (de excel bien sur et non pas de ces sous objets) et sont
déréférencement.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com



Avatar
Yann
Rebonjour,
Merci de la remarque pour l'ordre des opérations, malheureusement ça ne
marche toujours pas.
Cependant je viens de réaliser un test intéressant, puisqu'en mettant :

Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing

et en confimant manuellement que je ne veux pas enregistrer les
modifications dans mon fichier Excel la fermeture est effective et correcte.

Cependant avec :

exl2.Close SaveChanges:úlse
Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing

la fermeture n'est pas toujours effectuée. Le problème viendrait donc peut
être de "exl2.Close SaveChanges:úlse" ?
Y voyez-vous plus clair que moi ?

J'ai essayé de traquer le processus dans le gestionnaire des tâches comme
vous me l'avez suggéré, mais je ne sais pas trop comment faire, je constate
simplement que le PID et le processus restent. Que me faut-il surveiller
exactement pour identifier le problème?

Cordialement.
Yann


"Quasimodo" wrote:
Bonjour,
Attention, à l'ordre dans lequel vous enlevé des instances de vos
objets.
En 1er lieux vos feuilles ensuite votre application : set exl2 =
nothing ensuite le quit ensuite le set nothing de votre référence sur
excel.
Pour vous aidez utiliser le windows task manger pour traker
l'instanciation (de excel bien sur et non pas de ces sous objets) et
sont déréférencement.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com




Avatar
Yann
Bonjour,

Je suis obligé d'utiliser Excel pour mes calculs, puisque j'utilise des
feuilles Excel complexes qui à partir de données d'entrées me donnent les
résultats escomptés.
Par exemple je calcule un niveau de bruit sous Excel en rentrant en entrées
(Vitesse de rotation,Diamètre moyen des roues,Puissance,Rendement
polytropique,Epaisseur minimale du corps,Nombre d'aubes des roues,Niveau
garanti,Surface à 1 m du corps) et je récupère le niveau de bruit. Ce calcul
ne pourrait pas être transposé en VB car il utilise des formules et des
tables sous Excel.

Cordialement.
Yann


"Patrice Henrio" wrote:

Est-ce vraiment obligatoire de faire les calculs dans Excel au lieu de les
faire dans VB ?
Je pense qu'il y aurait un gain de temps et de résultat de cette façon.
Un exemple de ce que vous faites comme calcul permettrait sans doute de
traiter mieux votre problème.



Avatar
Quasimodo
Yann submitted this idea :
Rebonjour,
Merci de la remarque pour l'ordre des opérations, malheureusement ça ne
marche toujours pas.
Cependant je viens de réaliser un test intéressant, puisqu'en mettant :

Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing

et en confimant manuellement que je ne veux pas enregistrer les
modifications dans mon fichier Excel la fermeture est effective et correcte.

Cependant avec :

exl2.Close SaveChanges:úlse
Set exl2 = Nothing
appex2.Quit
Set appex2 = Nothing

la fermeture n'est pas toujours effectuée. Le problème viendrait donc peut
être de "exl2.Close SaveChanges:úlse" ?
Y voyez-vous plus clair que moi ?

J'ai essayé de traquer le processus dans le gestionnaire des tâches comme
vous me l'avez suggéré, mais je ne sais pas trop comment faire, je constate
simplement que le PID et le processus restent. Que me faut-il surveiller
exactement pour identifier le problème?

Cordialement.
Yann


"Quasimodo" wrote:
Bonjour,
Attention, à l'ordre dans lequel vous enlevé des instances de vos
objets.
En 1er lieux vos feuilles ensuite votre application : set exl2 =
nothing ensuite le quit ensuite le set nothing de votre référence sur
excel.
Pour vous aidez utiliser le windows task manger pour traker
l'instanciation (de excel bien sur et non pas de ces sous objets) et
sont déréférencement.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com







re,
bon, j'ai testé le code ci-dessous :

Dim objSheet As Object
Dim objWorb As Object
Dim objExcel As Object

Set objExcel = CreateObject("excel.Application")
Set objWorb = objExcel.Workbooks.Add
objWorb.Activate
Set objSheet = objWorb.Worksheets.Add()
objSheet.Activate
objSheet.Range("a1") = "test"
'objWorb.Close savechanges:=true, FileName:="c:temptest.xls"
objWorb.Close savechanges:úlse
Set objWorb = Nothing
objExcel.Quit
Set objExcel = Nothing

cela fonctionne très bien :')

Question :
1. il faut vérifier dans l'ensemble de votre code, que vous ne
réutiliser pas une instance de votre objet excel (Tout instance d'objet
n'existe que pendant tout la durée de vie de l'ensemble de ces
varaibles pointent sur lui même).
2. Si il existe du code vba dans votre feuille excel vérifier ce qu'il
fait !!!
3. Zorry, Zépu d'idées, fa falloir chercher la vérité ailleurs :'(

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Yann
Re,

Merci pour l'aide, malheureusement j'ai toujours mon problème.
(en fait j'ai une procédure d'ouverture, le code de ma form puis la
procédure de fermeture. je ne comprends pas pourquoi pour certaines form les
procédures fonctionnent correctement et pour d'autres non, c'est illogique).

S'il vous vient une autre idée n'hésitez pas !

Encore merci.
Yann


re,
bon, j'ai testé le code ci-dessous :

Dim objSheet As Object
Dim objWorb As Object
Dim objExcel As Object

Set objExcel = CreateObject("excel.Application")
Set objWorb = objExcel.Workbooks.Add
objWorb.Activate
Set objSheet = objWorb.Worksheets.Add()
objSheet.Activate
objSheet.Range("a1") = "test"
'objWorb.Close savechanges:=true, FileName:="c:temptest.xls"
objWorb.Close savechanges:úlse
Set objWorb = Nothing
objExcel.Quit
Set objExcel = Nothing

cela fonctionne très bien :')

Question :
1. il faut vérifier dans l'ensemble de votre code, que vous ne
réutiliser pas une instance de votre objet excel (Tout instance d'objet
n'existe que pendant tout la durée de vie de l'ensemble de ces
varaibles pointent sur lui même).
2. Si il existe du code vba dans votre feuille excel vérifier ce qu'il
fait !!!
3. Zorry, Zépu d'idées, fa falloir chercher la vérité ailleurs :'(

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com




Avatar
Jean Yves SÉVENO
Bonjour.

Ce problème de fermeture d'Excel est récurrent.

J'ai déjà eu l'occasion de participer à une discussion sur le sujet avec
quelqu'un qui le rencontrait.

Cela semble un problème de libération des objets par Excel. Là où ça se
complique, c'est que les objets en question peuvent aussi bien être ceux
qu'on crée dans le code que ceux qu'Excel crée lui-même "behind the scene".
Si on les a créés soit même, pas de problème, on peut les libérer (exemple :
si on a créé un objet Range nommé myRange, il suffit de prévoir un Set
myRange = Nothing). Par contre, on n'a pas la main sur ceux qu'Excel
instancie lui-même.

La seule solution que j'avais trouvé à l'époque qui fonctionne était la
suivante :

Utiliser Excel dans une Sub appelée à partir de ma Form en définissant
toutes les variables concernant l'utilisation d'Excel dans cette procédure,
autrement dit, pas de variable publique ou de niveau module concernant
Excel. Ainsi, à la fin de l'exécution de cette Sub, tous les objets étaient
libérés.

Exemple :

Sub Command1_Click()
Call TravailleAvecExcel
End Sub

Sub TravailleAvecExcel()
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
'Code
'Code
'Code
Set xlApp = Nothing
End Sub

Voilà, j'espère que ça t'aidera.

Cordialement.

Jean Yves



"Yann" a écrit dans le message de news:

Re,

Merci pour l'aide, malheureusement j'ai toujours mon problème.
(en fait j'ai une procédure d'ouverture, le code de ma form puis la
procédure de fermeture. je ne comprends pas pourquoi pour certaines form
les
procédures fonctionnent correctement et pour d'autres non, c'est
illogique).

S'il vous vient une autre idée n'hésitez pas !

Encore merci.
Yann


re,
bon, j'ai testé le code ci-dessous :

Dim objSheet As Object
Dim objWorb As Object
Dim objExcel As Object

Set objExcel = CreateObject("excel.Application")
Set objWorb = objExcel.Workbooks.Add
objWorb.Activate
Set objSheet = objWorb.Worksheets.Add()
objSheet.Activate
objSheet.Range("a1") = "test"
'objWorb.Close savechanges:=true, FileName:="c:temptest.xls"
objWorb.Close savechanges:úlse
Set objWorb = Nothing
objExcel.Quit
Set objExcel = Nothing

cela fonctionne très bien :')

Question :
1. il faut vérifier dans l'ensemble de votre code, que vous ne
réutiliser pas une instance de votre objet excel (Tout instance d'objet
n'existe que pendant tout la durée de vie de l'ensemble de ces
varaibles pointent sur lui même).
2. Si il existe du code vba dans votre feuille excel vérifier ce qu'il
fait !!!
3. Zorry, Zépu d'idées, fa falloir chercher la vérité ailleurs :'(

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com






Avatar
Yann
Bonjour,

Merci de votre message, je commençais à croire que j'étais devenu fou...
Je ne sais pas si je pourrai n'utiliser que des variables locales mais en
tout cas maintenant je comprends pourquoi ça ne marche pas, merci beaucoup!

Cordialement.
Yann

"Jean Yves SÉVENO" wrote:

Bonjour.

Ce problème de fermeture d'Excel est récurrent.

J'ai déjà eu l'occasion de participer à une discussion sur le sujet avec
quelqu'un qui le rencontrait.

Cela semble un problème de libération des objets par Excel. Là où ça se
complique, c'est que les objets en question peuvent aussi bien être ceux
qu'on crée dans le code que ceux qu'Excel crée lui-même "behind the scene".
Si on les a créés soit même, pas de problème, on peut les libérer (exemple :
si on a créé un objet Range nommé myRange, il suffit de prévoir un Set
myRange = Nothing). Par contre, on n'a pas la main sur ceux qu'Excel
instancie lui-même.

La seule solution que j'avais trouvé à l'époque qui fonctionne était la
suivante :

Utiliser Excel dans une Sub appelée à partir de ma Form en définissant
toutes les variables concernant l'utilisation d'Excel dans cette procédure,
autrement dit, pas de variable publique ou de niveau module concernant
Excel. Ainsi, à la fin de l'exécution de cette Sub, tous les objets étaient
libérés.

Exemple :

Sub Command1_Click()
Call TravailleAvecExcel
End Sub

Sub TravailleAvecExcel()
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
'Code
'Code
'Code
Set xlApp = Nothing
End Sub

Voilà, j'espère que ça t'aidera.

Cordialement.

Jean Yves




1 2