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 :

Exportation d'un recordset vers Excel ne fonctionne qu'une fois sur deux [AC-2010]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur agronome
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur agronome
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Exportation d'un recordset vers Excel ne fonctionne qu'une fois sur deux
    Bonjour,

    J'ai essayé (étant novice, j'insiste bien sur le terme "essayé") de développer une méthode permettant d'exporter le résultat d'une requête (stockée dans Access) vers un fichier Excel.

    Mon problème est le suivant : l'export fonctionne la première fois (à la perfection), cependant, lors du second export, les noms des champs du recordset ne s'affichent plus, seules les contenus s'affichent; ou pour être plus précis, on distingue 2 cas:
    1 - On laisse ouvert le premier excel généré avant de réitérer la méthode : les noms des champs s'affichent dans un nouveau classeur différent de celui des données.
    2 - On ferme le premier excel généré avant de réitérer la méthode : l'excel généré est vide et vba renvoie une erreur d’exécution '91'.

    L'erreur semble venir de la boucle qui insère le nom des champs :

    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
     
    Public Sub readRstInExcelSheet(sheetName As String)
     
        Dim appExcel As Excel.Application
        Dim wbExcel As Excel.Workbook
        Dim wsExcel As Excel.Worksheet
        Dim i As Integer
        Dim fieldName As String
     
        'Si le recordset est vide, on gère l'erreur et on ne crée pas de tableau
        If VG_rst.EOF = True Then
     
            MsgBox "Il n'y a pas d'enregistrement à lire. Désolé...", vbOKOnly, "Erreur"
     
        Else
     
        'On crée un classeur, une feuille Excel, puis on sélectionne la première feuille
            Set appExcel = CreateObject("Excel.Application")
            appExcel.Visible = True
            Set wbExcel = appExcel.Workbooks.Add
            Set wsExcel = wbExcel.Worksheets(1)
     
        'On nomme la feuille concernée
            wsExcel.Name = sheetName
     
        'On se déplace au premier enregistrement du recordset
            VG_rst.MoveFirst
     
        'On sélectionne la première cellule de la feuille
            wsExcel.Range("A1").Select
     
        'On nomme les différentes colonnes
            For i = 0 To VG_rst.Fields.Count - 1
     
                fieldName = VG_rst.Fields(i).Name
                ActiveCell.Value = fieldName
                ActiveCell.Offset(0, 1).Select
     
            Next i
     
        'On copie le recordset
            wsExcel.Range("A2").Select
            wsExcel.Range("A2").CopyFromRecordset VG_rst
     
        'Libération des références
            Set VG_rst = Nothing
            Set wbExcel = Nothing
            Set appExcel = Nothing
            Set wsExcel = Nothing
     
        End If
     
     
    End Sub
    à noter VG_rst = Variable globale stockant mon recordset

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Ce n'est pas forcement la cause de ton problème, mais je note quelque chose qu'il faut éviter en automation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                ActiveCell.Value = fieldName
                ActiveCell.Offset(0, 1).Select
    Il est préférable d'écrire de manière explicite.
    C'est à dire commencer les expressions impliquant l'application pilotée par automation, par les variables objets.

    Si on veut se passer de .Select on fera directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    wsExcel.Range("A1").Offset(0, i).Value = fieldName
    Avec .Select on utilisera la variable objet appExcel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                appExcel.ActiveCell.Value = fieldName
                appExcel.ActiveCell.Offset(0, 1).Select
    Si on n'écrit pas de cette façon, l'objet Excel.Application créé au début du code, n'est pas libéré à la fin du code et il reste un (ou plus) processus excel.exe en mémoire.

    Ma préférence serait de se passer des .Select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        'On nomme les différentes colonnes
            For i = 0 To VG_rst.Fields.Count - 1
     
                fieldName = VG_rst.Fields(i).Name
                wsExcel.Range("A1").Offset(0, i).Value = fieldName
     
            Next i
    Concernant la libération des variables objets, je les libère dans l'ordre de dépendance.
    Worksheet > Workbook > Application
    Et j'utilise la méthode .Quit d'Excel pour fermer ce dernier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Set wsExcel = Nothing
            Set wbExcel = Nothing
            appExcel.Quit
            Set appExcel = Nothing
    A+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur agronome
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur agronome
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour LedZeppII et merci,

    C'est super, le problème venait effectivement de là . Si j'ai bien compris, il s'agissait de bien spécifier l'objet sur lequel on travaille dans la boucle afin de nommer les colonnes dans le dernier classeur créé.

    En ce qui concerne la libération des variables, j'ai pour besoin de travailler directement sur le fichier Excel créé, du coup je n'ai pas ajouté le processus "appExcel.quit".

    Encore merci pour ta réactivité et le temps que tu auras accordé à ma demande.

    ++

    PS: Très bon album (si tu fais bien allusion à ça dans ton pseudo).

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,
    Citation Envoyé par Scregneugneu Voir le message
    Si j'ai bien compris, il s'agissait de bien spécifier l'objet sur lequel on travaille dans la boucle afin de nommer les colonnes dans le dernier classeur créé.
    Oui.
    ActiveCell est un peu hasardeux si on n'est pas certain que la feuille active est bien celle que l'on souhaite.

    PS: Très bon album (si tu fais bien allusion à ça dans ton pseudo)
    C'est exactement ça

    A+

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/04/2015, 22h47
  2. Réponses: 2
    Dernier message: 11/11/2012, 00h38
  3. [AC-2007] After Insert qui fonctionne mal une fois sur deux
    Par DamKre dans le forum IHM
    Réponses: 4
    Dernier message: 27/12/2011, 10h29
  4. Fermeture d'un formulaire : Ne fonctionne qu'une fois sur deux
    Par hellmaster78 dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/04/2008, 11h35
  5. [VBA-A2003] Export d'un Recordset vers Excel, avec SQL statement
    Par Wanoo14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2006, 22h06

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