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 13/10/2011, 11h40   #1
Invité régulier
 
Inscription : août 2008
Messages : 25
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 25
Points : 7
Points : 7
Par défaut Export de données Access sur Excel

Bonjour,

J'ai réalisé une petite appli sur Access 2003 SP3 qui exporte sous Excel les résultats d'une sélection. Ceci fonctionne bien sur une machine qui a cet Access 2003 et Office 2010 mais plante si on travaille sur d'autres machines qui ont Office 2003 SP3 avec ce même Access 2003.

Bien sur j'adapte dans les références de VBA le bon MS Excel Object Library sinon rien ne marche!

J'envoie les données depuis des recordsets (ouverts et fermés dès qu'il n'y en a plus besoin) dans une cession d'excel qui demarre avec un fichier modèle et le sauvegarde en le renommant. A la fin du transfert, je demande l'exécution d'une macro située dans le fichier Excel pour mettre en forme les données.

A ce stade, je laisse le dossier Excel ouvert pour que l'utilisateur voit si cela lui convient et le sauvegarde la ou il veut.

J'ai cependant plusieurs anomalies:
  1. En utilisant la synthaxe ME.NomControle dans le code associé aux formulaires, le controle existe bien dans 5 formulaires sur les 7 qui utilisent ce controle, mais sur deux d'entr'eux, Access le trouve bien (les majuscules apparaissent à la fin de la frappe) mais plante si on essaye d'utiliser une ligne du type
    Code :
    AppExcel.Cells(n,m) = ME.NomControle
    Ceci que le formulaire soit basé sur la table en direct ou via une requète. Et pourtant il est fonctionnel et s'affiche correctement dans le formulaire.
  1. La seconde, plus grave, est que l'exportation se fait sur qq dizaines d'enregistrements puis s'arrête en donnant un message "Erreur définie par l'application ou par l'objet".

J'ai vérifié si un enregistrement particulier contenait une valeur anormale mais rien d'évident. La mémoire disponible a-t-elle une incidence sur ce comportement? Il semble que si je selectionne peu d'enregistrement cela passe. QQu'un a-t-il une idée car le but est de diffuser cette appli sur pas mal de machines tournant sous 2003.

Merci d'avance
pedro91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 14h00   #2
Invité régulier
 
Inscription : août 2008
Messages : 25
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 25
Points : 7
Points : 7
Par défaut Suite de l'exposé

Mon premier message n'ayant pas lévé l'enthousiasme des foules, voila le code dans le détail!

Pour la comprehension, la base est essentiellement composée d'une table formations (T01), d'une table parcours (T05) liées entr'elles par une table de jonction (T06) puisqu'un parcours est composé de formations et qu'une formation peut faire partie de plusieurs parcours.

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
Dim appExcel As Excel.Application
Dim wbExcel As Excel.Workbook
Dim Chemin As String
Dim nF, nP As Integer
Dim idFormRst, idParcRst As Integer
 
Dim rst As Recordset                'Recordset de la selection en cours
Dim rstForm As Recordset            'Recordset pour charger tous les champs d'une formation
Dim rstParc, rstFdeP As Recordset   '     Idem pour un parcours et Recordset pour les formations d'un parcours
 
Set rst = Me.Recordset
Set appExcel = CreateObject("Excel.Application")
appExcel.Visible = True
 
Chemin = Application.CurrentProject.Path
Set wbExcel = appExcel.Workbooks.Open(Chemin & "\" & "Choix Formations.xls")
 
'Sauvegardele fichier modèle sous un autre nom
wbExcel.SaveAs (Chemin & "\Selection au " & Format(Date$, "dd_mm_yy") & ".xls")
 
'Appel de la feuille:
appExcel.Sheets("Formations").Select
appExcel.Cells(2, 2) = Date$
'parcours du recordset du choix de la sélection
If Not rst.EOF Then
        rst.MoveFirst
        nF = 4
        nP = 4
 
  While Not rst.EOF  'While 1
        idFormRst = rst![idFormFusion]
        idParcRst = rst![idParcFusion]
 
    If idFormRst <> 0 Then 'If 1
'Création d'un rst avec toutes les données de la formation
        Set rstForm = CurrentDb.OpenRecordset("SELECT * FROM T01_Formation " _
            & "INNER JOIN T021_LieuForm1 ON T021_LieuForm1.idlieuform1 = T01_Formation.idlieuForm1 " _
            & "WHERE T01_Formation.idFormation =" & idFormRst & ";", dbOpenDynaset)
'envoi dans l'onglet formation
        appExcel.Worksheets("formations").Select
        appExcel.Cells(nF, 1) = rstForm![idformation]
        appExcel.Cells(nF, 2) = rstForm![titreform]
 
suit environ 20 lignes du meme type puis
 
 
        nF = nF + 1
        rstForm.Close
    Else:  'Else 1
    If idParcRst <> 0 Then
 
 'Création d'un rst avec toutes les données du parcours
  Set rstParc = CurrentDb.OpenRecordset("SELECT * FROM T05_Parcours " _
            & "INNER JOIN T06_ListeParcMod ON T06_ListeParcMod.idparcoursliste = T05_Parcours.idparcours " _
            & "WHERE T06_ListeParcMod.idparcoursliste =" & idParcRst & ";", dbOpenDynaset)
 
                             appExcel.Worksheets("Parcours").Select
'envoi dans l'onglet parcours
        appExcel.Cells(nP, 1) = rstParc![idParcours]
        appExcel.Cells(nP, 2) = "Parcours"
        appExcel.Cells(nP, 3) = rstParc![TitreParc]
 
suit encore 20 lignes puis
 
'recherche des formations faisant partie du parcours
        Set rstFdeP = CurrentDb.OpenRecordset("SELECT * FROM T06_ListeParcMod " _
            & "WHERE T06_ListeParcMod.idparcoursliste =" & idParcRst & ";", dbOpenDynaset)
'Balayage des formations et envoi des données à Excel
        rstFdeP.MoveFirst
 
  While Not rstFdeP.EOF   'while 2
    idFormRst = rstFdeP![idformationliste]
            Set rstForm = CurrentDb.OpenRecordset("SELECT * FROM T01_Formation " _
            & "INNER JOIN T021_LieuForm1 ON T021_LieuForm1.idlieuform1 = T01_Formation.idlieuForm1 " _
            & "WHERE T01_Formation.idFormation =" & idFormRst & ";", dbOpenDynaset)
'envoi des données formations du parcours dans l'onglet parcours
        appExcel.Cells(nP, 1) = rstFdeP![idparcoursliste]
        appExcel.Cells(nP, 2) = rstForm![idformation]
        appExcel.Cells(nP, 3) = rstForm![titreform]
 
encore 20 lignes puis
 
 
        nP = nP + 1
        rstForm.Close
 
  rstFdeP.MoveNext
 
  Wend   'wend 2
 
        rstParc.Close
        rstFdeP.Close
    End If  'End if 1
    End If   'End if 2
 
     rst.MoveNext
 
  Wend   'wend 1
rst.Close
DoCmd.Close
Else
  MsgBox "Le jeu d'enregistrements est vide"
End If
'lance une macro dans Excel
 
appExcel.Run "miseenformelignes"
Peut etre cela vous parlera plus ainsi.

A+
pedro91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 14h39   #3
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 256
Points : 2 979
Points : 2 979
Bonjour,
pour ceci :
Citation:
Mon premier message n'ayant pas lévé l'enthousiasme des foules, voila le code dans le détail!
, on ne peut pas dire que ta patience soit légendaire.

Ensuite, dans ton code il manque au moins après chaque close ceci
Pour le reste, je ne procède jamais de la sorte, alors je ne peux t'aider.
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 15h51   #4
Invité régulier
 
Inscription : août 2008
Messages : 25
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 25
Points : 7
Points : 7
Par défaut Essais avec Set..Nothing

Merci pour ta réponse mais j'avoue que après qq heures passées sur le sujet cela commence à devenir énervant, d'autant plus rageant que cela marche bien sur un poste et pas sur l'autre!

J'ai donc mis set rstxx= nothing et je pensais que comme on libère de la mémoire cela allait dans le bon sens mais tj le meme pb.

En fait, j'ai l'impression que le transfer se fait pour une certaine quantité de données puis s'arrete avec tj le meme message: erreur définie par l'application ou par l'objet. Il est un fait qu'à part les versions d'office, les ordi ont une mémoire très différente: 1Go pour celui qui plante, 4 pour l'autre.

Tu dis que tu ne procède jamais comme cela, as tu une autre piste?

A part cela, c'est un bien joli bébé sur la photo!

Merci
pedro91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 16h25   #5
Invité régulier
 
Inscription : août 2008
Messages : 25
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 25
Points : 7
Points : 7
Par défaut Autre piste possible

Je viens de penser à une autre limite possible: Dans access, j'exporte des champs memo qui ont plus de 255 caractères: y a-t-il une limite entre office 2003 sous windows XP par rapport a office 2010 sous Windows 7 soit dans la copie, le transfer ou la mémoire allouée qui provoquerait le blocage sur ces enregistrements?

A+
pedro91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 17h12   #6
Nouveau Membre du Club
 
Stéphane
Formateur en informatique
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations personnelles :
Nom : Stéphane

Informations professionnelles :
Activité : Formateur en informatique

Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 25
Points : 25
Bonjour

Cela ne va pas solutionner ton pb ...
Mais ça permet de placer le contenu d'un Recordset dans Excel Avec la méthode CopyFromRecordset

Cordialement,

Code :
1
2
3
4
5
6
7
 'Inscription des titres de champs dans Excel
 For intNbChamp = 1 To objRst.Fields.Count
 xlApp.ActiveSheet.Cells(lngNumLigne, intNbChamp).Value = objRst.Fields(intNbChamp - 1).Name
Next intNbChamp
 
'Copie du recordset dans Excel
xlApp.ActiveSheet.Cells(lngNumLigne + 1, 1).CopyFromRecordset objRst
Stef999 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 18h49   #7
Invité régulier
 
Inscription : août 2008
Messages : 25
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 25
Points : 7
Points : 7
Par défaut Reponse et origine du pb

Merci pour ta réponse, je garde cela dans un coin, on ne sait jamais cela peut tj servir!

En fait, j'ai fini par trouver l'origine du pb: j'ai développé l'appli sur une machine équipée d'office 2010 sous Win7 et elle plantait avec office 2003 sous XP. En fait, il semble impossible de transférer plus de 255 catactères sous 2003. Si je limite le nombre de caractères venant des champs mémo à 255 (par MID(nomchamp,1,255)), plus de pb mais bien sur pas plus de 255 caractères! Chose curieuse d'ailleurs, en utilisant 300 comme limite, cela ne plante pas non plus mais seuls 255 caractères sont transférés à la cellule Excel. Mystère!

A signaler par ailleurs un comportement différent selon les machines: sur l'ordi en Excel 2010 et Win7, le fait de laisser l'objet appexcel ouvert entre deux sessions ne pose pas pb. Sur une autre, Office 2007 et Win7, il faut faire appexcel.close et appexcel=nothing pour ne pas planter au deuxième jet.

Merci à tous pour ces aides.
pedro91 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 05h00.


 
 
 
 
Partenaires

Hébergement Web