IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Export de données Access sur Excel


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 26
    Points
    26
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
      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

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 26
    Points
    26
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  3. #3
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,
    pour ceci :
    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.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 26
    Points
    26
    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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 26
    Points
    26
    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+

  6. #6
    Membre actif
    Formateur en informatique
    Inscrit en
    Janvier 2011
    Messages
    134
    Détails du profil
    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 134
    Points : 205
    Points
    205
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 26
    Points
    26
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recuperer donnes access sur excel
    Par yoann_deygas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/12/2007, 10h41
  2. Exportation de données access vers excel
    Par garsflo dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/05/2007, 01h13
  3. exportation de données access vers excel
    Par ptitemel dans le forum Microsoft Office
    Réponses: 3
    Dernier message: 12/07/2006, 14h24
  4. exporter des données access vers excel
    Par Sebastien_INR59 dans le forum Access
    Réponses: 8
    Dernier message: 20/06/2006, 23h29
  5. comment afficher des données Access sur Excel ??
    Par merlubreizh dans le forum Access
    Réponses: 9
    Dernier message: 14/09/2005, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo