Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 20h19   #1
Invité régulier
 
Inscription : mars 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 32
Points : 7
Points : 7
Par défaut Processus Excel actif apres procedure Access

Bonjour,

Je viens vers vous pour essayer de résoudre un problème lié à un processus d'Excel toujours actif après une écriture de données en VBA, depuis Access vers un classeur xls (l'objectif étant d'alimenter un tableau ligne par ligne avec des calculs effectués depuis ma BDD). J'ai pourtant cherché longuement des solutions à ce dysfonctionnement (déjà identifié dans des forums notamment ici) mais sans résultat pour moi.

Au premier lancement de la procédure, tout se déroule normalement. Le deuxième lancement (sans fermer access) bloque sur la méthode "range" qui me permet de récupérer la derniere ligne remplie dans une colonne. Excel est alors actif dans les processus Windows avant de lancer la procédure.
Si je supprime la ligne dédiée à la récupération de la dernière ligne excel, je ferme correctement le processus excel à chaque lancement.

ci-dessous mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Private Sub btn_test_export_xls_wikipcs_Click()
 
'Dim appexcel As Excel.Application
Dim appexcel As New Excel.Application 'remplace la ligne précédente à partir d'une réponse trouvé
Dim wbexcel As Excel.Workbook
Dim cnn1 As ADODB.Connection
Dim myrecordset As New ADODB.Recordset
Dim sql As String
Dim lastligne, u, i As Integer
 
'Appel du fichier Excel à remplir
 
appexcel.Visible = False ' testé à vrai sans succès 
Set wbexcel = appexcel.Workbooks.Open("E:\test.xls")
 
' Appel de la feuille
 
appexcel.Sheets("Feuil1").Select
 
 
' Recup derniere ligne B1 et affecte ligne +1 (bug à ce niveau)
 
lastligne = Range("B1").End(xlDown).Row
u = lastligne + 1
 
 
' recordset + requete calcul
 
Set cnn1 = CurrentProject.Connection
myrecordset.ActiveConnection = cnn1
 
sql = "ma requete"
 
'ouverture recordset
 
myrecordset.Open sql
 
i = 2
 
Do While myrecordset.EOF = False
 
' rempli les valeurs dans excel
 
appexcel.Cells(u, i) = myrecordset.Fields("CompteDeAvancement du PCS")
 
 
myrecordset.MoveNext
 
' vide recordset + deconnect
 
i = i + 1
 
Loop
 
myrecordset.Close
Set cnn1 = Nothing
 
' ferme excel
 
wbexcel.SaveAs "E:\test.xls"
wbexcel.Close
appexcel.Quit
 
Set appexcel = Nothing
Set wbexcel = Nothing
 
End Sub
En vous remerciant d'avance pour votre aide.
Cirrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 20h40   #2
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir.

Je te propose une modif de cette partie
Code :
1
2
3
4
5
6
7
8
9
10
11
12
appexcel.Visible = False ' testé à vrai sans succès 
Set wbexcel = appexcel.Workbooks.Open("E:\test.xls")
 
' Appel de la feuille
 
appexcel.Sheets("Feuil1").Select
 
 
' Recup derniere ligne B1 et affecte ligne +1 (bug à ce niveau)
 
lastligne = Range("B1").End(xlDown).Row
u = lastligne + 1
réécrite ainsi, avec un objet supplémentaire à déclarer : ShExcel As Excel.Worksheet (variable à libérer en fin de procédure)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
appexcel.Visible = False ' testé à vrai sans succès 
appExcel.EnableEvents = False
Set wbexcel = appexcel.Workbooks.Open("E:\test.xls")
 
' Appel de la feuille
 
Set Shexcel = wbexcel.WorkSheets("Feuil1")
 
 
' Recup derniere ligne B1 et affecte ligne +1 (bug à ce niveau)
 
lastligne = Shexcel.Range("B1").End(xlDown).Row
u = lastligne + 1
J'ai modifié en précisant les objets sans appel à l'objet actif et j'ai ajouté
Code :
appExcel.EnableEvents = False
pour bloquer d'éventuelles procédures évènementielles.

Encore un détail : par précaution tu devrais types lastligne et u long plutôt qu'integer.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 22h22   #3
Invité régulier
 
Inscription : mars 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 32
Points : 7
Points : 7
Bonsoir,

Merci beaucoup pour ta réponse détaillée et tes conseils, ça fonctionne parfaitement

Cordialement,
HC
Cirrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h51.


 
 
 
 
Partenaires

Hébergement Web