Regler le probleme entre vb et excel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 421 fois - Téléchargée 32 fois

Contenu du snippet

Quelquefois on a besoin d'ecrire des données ou faire des graphes sur Excel à partir d'une appli que l'on développe en VB... J'ai du faire ça et j'ai rencontré un p'tit probleme ... la première fois tout se passe bien mais les suivantes plantait en me disant "variable de block with non définie", et un process Excel residait en mémoire... la je me suis dis que j'allais trouver la solution sur Codes Sources ...mais non seul des pleurnichards se lamentaient d'avoir trouvé un bug incontournable..., faut se sortir les doits les gars... MSDN vous connaissez ??? donc voila comment régler ce petit probleme : IL FAUT ABSOLUMENT PASSER PAR DES VARIABLES DECLAREES MANUELLEMENT et non pas par les objes direct...sinon VB utilise des instances d'objet a lui et qui sont globale a l'appli et comme elles ne sont pas déclarée sont introuvable pour les tuer...
Donc faite comme suit...

Source / Exemple :


Option Explicit

      Private Sub Command1_Click()
         Dim xlApp As Excel.Application
         Dim xlBook As Excel.Workbook
         Dim xlSheet As Excel.Worksheet
         Set xlApp = CreateObject("Excel.Application")
         Set xlBook = xlApp.Workbooks.Add
         Set xlSheet = xlBook.Worksheets("Sheet1")
         xlSheet.Range(Cells(1, 1), Cells(10, 2)).Value = "Hello"
         xlBook.Saved = True
         Set xlSheet = Nothing
         Set xlBook = Nothing
         xlApp.Quit
         Set xlApp = Nothing
      End Sub

Conclusion :


ULR MSDN : http://support.microsoft.com/default.aspx?kbid=178510
ou : http://support.microsoft.com/default.aspx?scid=kb;en-us;319832
------- tout en Anglais ...-------

A voir également

Ajouter un commentaire

Commentaires

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.