thedentiste
Messages postés6Date d'inscriptiondimanche 20 mai 2001StatutMembreDernière intervention20 octobre 2004
-
10 août 2004 à 14:02
amalcon
Messages postés12Date d'inscriptionvendredi 22 octobre 2004StatutMembreDernière intervention 8 février 2007
-
6 sept. 2006 à 17:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
amalcon
Messages postés12Date d'inscriptionvendredi 22 octobre 2004StatutMembreDernière intervention 8 février 2007 6 sept. 2006 à 17:02
Je cherchais désepérement pourquoi excel continuait à tourner alors que j'avais tout fermé correctement, sans trouver mon problème.
Merci infiniment pour ces explications.
Pour abbassi_omar, tu as essayé de ne déclarer que
Dim xlApp (sans le As Excel.Application )
Dim xlBook (sans le As Excel.Workbook )
Dim xlSheet (sans le As Excel.Worksheet )
et de ne pas oublier les xlSheet. devant chaque Cell, Range et autre Rows/Columns ?
J'avais le même pb : excel qui ne se ferme pas bien. Cela a été résolu grace à ca : je peux maintenant faire 2 fois la même action, sans qu'il me dise que le serveur est introuvable ou autre erreur bizarre.
abbassi_omar
Messages postés23Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention 3 août 2007 8 juin 2006 à 04:12
merci pour votre aide
mais j'ai un prblm dans une application.
j'utilise un classeur exel existe pour imprimer des etats,quand j'appel le classeur pour la premier fois ca marche bien mais si je le demande pour une deuxieme fois les cellule vienne vide.
pour avoir la possibilite d'imprimer une 2eme fois il me faut quitter l'application du tout!!! et ca marche pas dans des application proff
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 janvier 2005 13 août 2004 à 16:48
Ca marche le "object is nothing" si il n'y a pas eu de "object.open" ?
A vrai dire j'ai pas pensé à essayer ...
cs_cyrilp
Messages postés140Date d'inscriptionmercredi 4 octobre 2000StatutMembreDernière intervention12 août 2009 13 août 2004 à 16:42
je n'ai pas compris ce que tu voulais dire exactement Zigarn....
Mais avec le code suivant :
If Not <Mon Objet> Is Nothing Then
' destruction des variables
End If
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 janvier 2005 13 août 2004 à 16:02
Par contre il y a toujours le problème que en cas de bug, il n'y a, semble-t-il, pas d'appel à ma procédure de fermeture et donc non fermeture de Excel. Si je le fais dans mon handler d'erreur appelé par On Error, et bien si le bug est arrivé avant l'ouverture, il me dit qu'il peut pas fermer quelque chose qui n'est pas ouvert (et je le comprends !). Y a-t-il un moyen de tester l'existence d'un objet du coup ?
cs_cyrilp
Messages postés140Date d'inscriptionmercredi 4 octobre 2000StatutMembreDernière intervention12 août 2009 12 août 2004 à 15:47
D'accord avec Zigarn,
Le tout n'est pas de faire un "Set Nothing", cela detruit l'objet mais pas EXCEL.
EXCEL doit être fermé via un .QUIT !!!
En respectant cela, je n'ai jamais eu de souci de EXCEL restant en mémoire !
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 janvier 2005 12 août 2004 à 10:44
Désolé pour la parenthèse en trop.
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 janvier 2005 12 août 2004 à 10:42
Je viens de me lancer dans la liaison à Excel depuis VB et suis souvent tombé sur ce problème de processus Excel non terminé mais il m'a suffit de faire bien attention à fermer les objets et puis c'est tout :
Dim appExcel As New Excel.Application
Dim wbExcel As Excel.Workbook
Dim wsExcel As Excel.Worksheet
Set wbExcel = appExcel.Workbooks.Open("essai.xls")
For Each wsExcel In wbExcel.Worksheets
wsExcel.Cells(1, 1).Value) = "tentative"
Next
wbExcel.Close
appExcel.Quit
Et il faut aussi faire attention de toujours fermer même si on quitte inopinement la procédure.
Voilà !
cs_le_chacal
Messages postés25Date d'inscriptionmardi 28 octobre 2003StatutMembreDernière intervention 4 août 2005 11 août 2004 à 20:27
pas chez moi qd je fait ça il reste un process excel qui m'empeche même de réouvrir excel à partir de windows...
et c'etait comme ça que je faisais déjà quand j'ai rencontré ce problème....
bref maintenant c résolu tout fonctionne et c le principal !
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 11 août 2004 à 17:20
car la, Vb crée une instance de WorkBook et une instance de WorkSheets qui lui sont propres et qui restent liés a l'appli malgré que l'on détruise le XlApp par Set XlApp = Nothing
Il faut creer une variable XlBook qui contient le WorkBook (pareil pour le WorkSheets) et la on controle les instances et on peut ainsi les détruire ...
(pour eviter de tout declarer jusqu'a Cell , utilisez
With XlSheet
....
.Cell(1.1)= "hello)
....
end With
)
Comme ca Excel peux se fermer, il n'est plus lié a l'appli car on ferme chaque objet manuellement
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 11 août 2004 à 15:46
cela corrige le problème comme indiqué dans MSDN. Le problème vient du fait que faire appel à Cells sans préciser xlSheet devant entraine la création d'une instance d'Excel qui risque de ne pas fonctionner dès le second appel de la fonction, conclusion : ne pas oublier de préfixer tous les objets par leur propriétaire afin d'éviter la création d'une instance parasite.
cs_le_chacal
Messages postés25Date d'inscriptionmardi 28 octobre 2003StatutMembreDernière intervention 4 août 2005 11 août 2004 à 11:51
En fait le probleme se pose dans les cas ou apres avoir déclaré un Dim xlApp As New Excel.Application (qui fonctionne aussi bien que dans l'exemple que j'ai donné) , on utilise directement les objets fils de xlApp tels que :
With xlApp.Workbook.worksheet(1)
...
End With
au lieu de
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
With xlSheet
.cells(1, 1) = "Coucou"
end with
car la l'instance de workbook et de worksheet sont créés par Vb et donc on ne peux les détruire...car elle ne sont pas accessible du code ...et le process Excel reste en mémoire...et si tu rappelle la même fonction ca plante !
le fait de faire xlApp.Quit et Set xlApp = nothing reste en fonction de ton appli...si tu veux garder Excel ouvert, le fait pas...
J'espere avoir répondu a ta question...
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 11 août 2004 à 08:51
CreateObject sert si tu déclares un Objet, puisque là tu déclares un Excel.Application, tu peux directement faire un Set xlApp = New Excel.Application ou meme Dim xlApp As New Excel.Application
Qu'est-ce que tu veux dire par : IL FAUT ABSOLUMENT PASSER PAR DES VARIABLES DECLAREES MANUELLEMENT et non pas par les objes direct... ?
Tu veux dire qu'il ne faut pas oublier de faire Set xlApp = Nothing avant de quitter la fonction ? C'est vrai ! si tu laisses Excel visible en quittant la fonction et meme en quittant VB, Excel restera visible indéfiniment, ce qui veux bien dire que VB ne détruit jamais l'instance (sauf sous Access 97 : Excel disparait au bout de quelques secondes, mais pas avec Access 2000 ou XP !)
cs_le_chacal
Messages postés25Date d'inscriptionmardi 28 octobre 2003StatutMembreDernière intervention 4 août 2005 10 août 2004 à 14:59
ben de rien quand on peut aider... ;o)
thedentiste
Messages postés6Date d'inscriptiondimanche 20 mai 2001StatutMembreDernière intervention20 octobre 2004 10 août 2004 à 14:02
Merci beaucoup je suis tombé dessus par hasard et c'est pile poil ce qui vient de m'arriver dans mon appli vba j'avais plein de process excel en memoire
6 sept. 2006 à 17:02
Merci infiniment pour ces explications.
Pour abbassi_omar, tu as essayé de ne déclarer que
Dim xlApp (sans le As Excel.Application )
Dim xlBook (sans le As Excel.Workbook )
Dim xlSheet (sans le As Excel.Worksheet )
et de ne pas oublier les xlSheet. devant chaque Cell, Range et autre Rows/Columns ?
J'avais le même pb : excel qui ne se ferme pas bien. Cela a été résolu grace à ca : je peux maintenant faire 2 fois la même action, sans qu'il me dise que le serveur est introuvable ou autre erreur bizarre.
8 juin 2006 à 04:12
mais j'ai un prblm dans une application.
j'utilise un classeur exel existe pour imprimer des etats,quand j'appel le classeur pour la premier fois ca marche bien mais si je le demande pour une deuxieme fois les cellule vienne vide.
pour avoir la possibilite d'imprimer une 2eme fois il me faut quitter l'application du tout!!! et ca marche pas dans des application proff
13 août 2004 à 16:48
A vrai dire j'ai pas pensé à essayer ...
13 août 2004 à 16:42
Mais avec le code suivant :
If Not <Mon Objet> Is Nothing Then
' destruction des variables
End If
13 août 2004 à 16:02
12 août 2004 à 15:47
Le tout n'est pas de faire un "Set Nothing", cela detruit l'objet mais pas EXCEL.
EXCEL doit être fermé via un .QUIT !!!
En respectant cela, je n'ai jamais eu de souci de EXCEL restant en mémoire !
12 août 2004 à 10:44
12 août 2004 à 10:42
Dim appExcel As New Excel.Application
Dim wbExcel As Excel.Workbook
Dim wsExcel As Excel.Worksheet
Set wbExcel = appExcel.Workbooks.Open("essai.xls")
For Each wsExcel In wbExcel.Worksheets
wsExcel.Cells(1, 1).Value) = "tentative"
Next
wbExcel.Close
appExcel.Quit
Et il faut aussi faire attention de toujours fermer même si on quitte inopinement la procédure.
Voilà !
11 août 2004 à 20:27
et c'etait comme ça que je faisais déjà quand j'ai rencontré ce problème....
bref maintenant c résolu tout fonctionne et c le principal !
11 août 2004 à 17:20
la ligne suivante fonctionne toujours très bien :
xlApp.Workbooks(1).Worksheets(1).Range( _
xlApp.Workbooks(1).Worksheets(1).Cells(1, 1), _
xlApp.Workbooks(1).Worksheets(1).Cells(10,2)).Value = "Hello"
11 août 2004 à 16:55
XlsApp.WorkBook.WorkSheets(1) .cell(1 ,1) = "hello"
car la, Vb crée une instance de WorkBook et une instance de WorkSheets qui lui sont propres et qui restent liés a l'appli malgré que l'on détruise le XlApp par Set XlApp = Nothing
Il faut creer une variable XlBook qui contient le WorkBook (pareil pour le WorkSheets) et la on controle les instances et on peut ainsi les détruire ...
(pour eviter de tout declarer jusqu'a Cell , utilisez
With XlSheet
....
.Cell(1.1)= "hello)
....
end With
)
Comme ca Excel peux se fermer, il n'est plus lié a l'appli car on ferme chaque objet manuellement
11 août 2004 à 15:46
xlSheet.Range(Cells(1, 1), Cells(10, 2)).Value = "Hello"
en :
xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(10, 2)).Value = "Hello"
cela corrige le problème comme indiqué dans MSDN. Le problème vient du fait que faire appel à Cells sans préciser xlSheet devant entraine la création d'une instance d'Excel qui risque de ne pas fonctionner dès le second appel de la fonction, conclusion : ne pas oublier de préfixer tous les objets par leur propriétaire afin d'éviter la création d'une instance parasite.
11 août 2004 à 11:51
With xlApp.Workbook.worksheet(1)
...
End With
au lieu de
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
With xlSheet
.cells(1, 1) = "Coucou"
end with
car la l'instance de workbook et de worksheet sont créés par Vb et donc on ne peux les détruire...car elle ne sont pas accessible du code ...et le process Excel reste en mémoire...et si tu rappelle la même fonction ca plante !
le fait de faire xlApp.Quit et Set xlApp = nothing reste en fonction de ton appli...si tu veux garder Excel ouvert, le fait pas...
J'espere avoir répondu a ta question...
11 août 2004 à 08:51
Qu'est-ce que tu veux dire par : IL FAUT ABSOLUMENT PASSER PAR DES VARIABLES DECLAREES MANUELLEMENT et non pas par les objes direct... ?
Tu veux dire qu'il ne faut pas oublier de faire Set xlApp = Nothing avant de quitter la fonction ? C'est vrai ! si tu laisses Excel visible en quittant la fonction et meme en quittant VB, Excel restera visible indéfiniment, ce qui veux bien dire que VB ne détruit jamais l'instance (sauf sous Access 97 : Excel disparait au bout de quelques secondes, mais pas avec Access 2000 ou XP !)
10 août 2004 à 14:59
10 août 2004 à 14:02
Thanks