REGLER LE PROBLEME ENTRE VB ET EXCEL

thedentiste Messages postés 6 Date d'inscription dimanche 20 mai 2001 Statut Membre Dernière intervention 20 octobre 2004 - 10 août 2004 à 14:02
amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/25308-regler-le-probleme-entre-vb-et-excel

amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Derniè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és 23 Date d'inscription dimanche 12 novembre 2000 Statut Membre Derniè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és 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 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és 140 Date d'inscription mercredi 4 octobre 2000 Statut Membre Dernière intervention 12 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és 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 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és 140 Date d'inscription mercredi 4 octobre 2000 Statut Membre Dernière intervention 12 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és 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005
12 août 2004 à 10:44
Désolé pour la parenthèse en trop.
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 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és 25 Date d'inscription mardi 28 octobre 2003 Statut Membre Derniè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és 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
11 août 2004 à 17:20
Hé bien c'est faux !

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"
cs_le_chacal Messages postés 25 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 4 août 2005
11 août 2004 à 16:55
En fait ce qui se passe c'est que même préfixé par le propriétaire il ne faut pas utiliser les objets enfants tels quels comme

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
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
11 août 2004 à 15:46
En changeant la ligne :

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.
cs_le_chacal Messages postés 25 Date d'inscription mardi 28 octobre 2003 Statut Membre Derniè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és 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Derniè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és 25 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 4 août 2005
10 août 2004 à 14:59
ben de rien quand on peut aider... ;o)
thedentiste Messages postés 6 Date d'inscription dimanche 20 mai 2001 Statut Membre Dernière intervention 20 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

Thanks
Rejoignez-nous