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 plusieurs requetes access vers excel [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut Export plusieurs requetes access vers excel
    bonjour à tous,

    je désire exporter plusieurs requêtes access vers excel. mais j'obtiens toujours l'erreur suivante sans trop savoir pourquoi :
    " type d'argument byref incompatible". voici mon code :
    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    sous programme-------------------------------------
    Private Sub ExportFeuille(xlSheet As Excel.Worksheets, rec As ADODB.Recordset)
    'les entetes
    ' .Fields(Index).Name renvoie le nom du champ
    For J = 0 To rec.Fields.Count - 1
    xlSheet.Cells(3, J + 1) = rec.Fields(J).Name
    ' Nous appliquons des enrichissements de format aux cellules
    With xlSheet.Cells(3, J + 1)
    .Interior.ColorIndex = 15
    .Interior.Pattern = xlSolid
    .Borders(xlEdgeBottom).LineStyle = xlContinuous
    .Borders(xlEdgeBottom).Weight = xlThin
    .Borders(xlEdgeBottom).ColorIndex = xlAutomatic
    .HorizontalAlignment = xlCenter
    End With
    Next J
    ' recopie des données à partir de la ligne 3
    I = 4
    Do While Not rec.EOF
    For J = 0 To rec.Fields.Count - 1
    ' .Fields(Index).Type renvoie le type du champ
    ' si c'est un Texte (dbText) nous insérons "'" pour
    ' qu'il soit reconnu par Excel comme du Texte
    If rec.Fields(J).Type = dbText Then
    xlSheet.Cells(I, J + 1) = "'" & rec.Fields(J)
    Else
    xlSheet.Cells(I, J + 1) = rec.Fields(J)
    End If
    Next J
    I = I + 1
    rec.MoveNext
    Loop
     rec.Close
    End Sub
     
    programme principal---------------------------
     
    Function TransfertExcelAutomation1()
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlBook As Excel.Workbook
    Dim I As Long, J As Long
    Dim t0 As Long, t1 As Long
    t0 = Timer
    Dim rec1 As Recordset
    Dim rec2 As Recordset
    Dim rec3 As Recordset
    Dim rec4 As Recordset
     
    'Initialisations
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    'Ajouter une feuille de calcul
       Set xlSheet = xlBook.Worksheets.Add
       xlSheet.Name = "Tutor1"
       Set rec1 = CurrentDb.OpenRecordset("SIBANQUE_RCA", dbOpenSnapshot)
       ' le titre1
       ' écriture dans la cellule de ligne 1 et de colonne 1
       xlSheet.Cells(1, 1) = "Première Structure des données"
       '''''''''''''''''
       '''''''''''''''''
                 Set xlSheet = xlBook.Worksheets.Add
                 xlSheet.Name = "Tutor2"
                 Set rec2 = CurrentDb.OpenRecordset("SIBANQUE_RLIV", dbOpenSnapshot)
       ' le titre2
       ' écriture dans la cellule de ligne 1 et de colonne 1
                 xlSheet.Cells(1, 1) = "Deuxième Structure des donées"
       '''''''''''''''''
                     Set xlSheet = xlBook.Worksheets.Add
                     xlSheet.Name = "Tutor3"
                     Set rec3 = CurrentDb.OpenRecordset("SIBANQUE_RPEP", dbOpenSnapshot)
       ' le titre3
       ' écriture dans la cellule de ligne 1 et de colonne 1
                     xlSheet.Cells(1, 1) = " Troisième Structure des donées"
       '''''''''''''''''
                        Set xlSheet = xlBook.Worksheets.Add
                        xlSheet.Name = "Tutor4"
                        Set rec4 = CurrentDb.OpenRecordset("SIBANQUE_RCIF", dbOpenSnapshot)
       ' le titre4
       ' écriture dans la cellule de ligne 1 et de colonne 1
                        xlSheet.Cells(1, 1) = "Quatrième Structure des donées"
       '''''''''''''''''
       ''''''''''''''''''
     
    Call ExportFeuille(Tutor1, rec1)
    Call ExportFeuille(Tutor2, rec2)
    Call ExportFeuille(Tutor3, rec3)
    Call ExportFeuille(Tutor4, rec4)
    rec1.Close
    rec2.Close
    rec3.Close
    rec4.Close
    ' code de fermeture et libération des objets
    xlBook.SaveAs "C:\Export.xlsx"
    xlApp.Quit
    rec1.Close
    Set rec = Nothing
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    t1 = Timer
    Debug.Print I & " enregistrements", Format(t1 - t0, "0") & " secondes"
     
    Exit Sub
    Test_Err:
     
    If Err.Number <> 91 Then
     
    MsgBox "Une erreur inattendue est apparue dans la fonction Test. L'erreur N° " & Err.Number & " ( " & Err.Description & " )! Contactez l'administrateur.", vbOKOnly + vbCritical, "Erreur inattendue !"
     
    Else
     
    MsgBox "Exportation réussie", vbOKOnly, "Export vers Excel"
     
    End If
    End Function
    le programme bloque toujours au niveau de l'opération suivante: Call ExportFeuille(Tutor1, rec1).
    merci de me dire ce qui ne vas pas.

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ExportFeuille(Tutor1, rec1).
    C'est normal que ça plante, tes TutorXX ne sont ni déclarés ni typés.

    Pour exporter vers Excel, 2 solutions :
    1/
    TransferSpreadSheet que tu peux exercer dans une boucle pour attaque les requêtes à exporter.
    Celles-ci iront dans des classeurs distincts
    Tu peux alors par automation ouvrir chaque classeur et déplacer chaque feuille dans un classeur unique.

    2/ par automation instancier Excel et créer le classeur avec le nombre de feuille qui convient
    Affecter à chaque feuille un objet Worksheet pour la manipulation plus aisée.
    Affecter un objet Range à chaque feuille et user de la méthode CopyFromRecordSet pour inscrire tes données.

    En d'autre termes, ton code est un peu confus, peu générique et difficile à faire évoluer par manque de souplesse...
    Créé des fonctions génériques simples et parfaitement qualifiées (mise en forme, ajout de feuilles, création de classeur etc...) et apelle les en leur passant les paramètres idoines, tu verras que tu n'auras plus d'erreurs; et n'oublie pas le Option Explicit...

    Argy

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    bonjour Jean Philippe,

    merci déja d'avoir répondu promptement.

    oui bien sur vous avez tout à fait raison au niveau des tutorxxxx, je les ai remplacé par ce ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Call ExportFeuille(xlSheet1, rec1)
    Call ExportFeuille(xlSheet2, rec2)
    Call ExportFeuille(xlSheet3, rec3)
    Call ExportFeuille(xlSheet4, rec4)
    mais j'ai toujours le même message d'erreur.

    par rapport à la méthode transferspreadsheet, avez vous un exemple ?

    merci d'avance!

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    C'est parail, tant que tu ne déclares pas tes objets Worksheet d'une part et que tu ne les instancies pas d'autre part, ça plantera.
    Met un Option Explicit en en-tête de module et tu en sauras un peu plus.

    Sinon voici un truc plus simple (en 9 lignes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub ExportToExcelMultipleWorkbooks()
    Const LIST_OF_QUERIES                                           As String = "Requête 1;Requête 2;Requête 3;Requête 4"
    Dim straQueries()                                       As String
    Dim strFileName                                        As String
    Dim Q                                                  As Integer
     
        straQueries = Split(LIST_OF_QUERIES, ";")
        For Q = LBound(straQueries) To UBound(straQueries)
            strFileName = CurrentProject.Path & "\" & straQueries(Q) & ".xls"
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, straQueries(Q), strFileName, True
        Next
    End Sub
    Argy

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    merci Argy pour ta réponse,

    STP comment pourrait se présenter requeteXX ?
    est qu'une requête du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM EmployeesTable WHERE NOM PAS NULL
    pourrait fonctionner ?

    en plus argy,

    selon ton code comment se connecter à la base de données active ?
    j'ai essayé de modifier ton code mais que dalle ....

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Non, la méthode requiert un nom d'objet.
    Donc tu peux faire un QueryDefs qui vérifie via CurrentDB que la requête existe ou non avec une gestion d'erreur optimiste .
    Si elle existe, tu affectes la propriété SQL de l'objet sinon, tu fais un CreateQueryDefs avec le nom de ton choix et la clause SQL avec.

    Le code que je t'ai transmi ne requiert pas de connexion.

    Argy

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    bonjour ergy,

    après modification de mon code ainsi j'obtiens l'erreur donc voici le numero : 3011. le débogueur me montre que c'est l'opération "DoCmd.TransferSpreadsheet" qui serait à l'origine de l'erreur.

    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
     
    Sub ExportToExcelMultipleWorkbooks()
    Const LIST_OF_QUERIES As String = "R1;R2;R3;R4"
    Dim straQueries() As String
    Dim Q As Integer
    Dim oDb As DAO.Database
    Dim oRst As DAO.Recordset
    Dim strFileName As String
     
    Set oDb = CurrentDb
     
     R1 = "select * from SIBANQUE_RCAT"
     R2 = "select * from SIBANQUE_RPEP"
     R3 = "select * from SIBANQUE_RCIF"
     R4 = "select * from SIBANQUE_RCRP"
     Set oRst = oDb.OpenRecordset(R1)
     Set oRst = oDb.OpenRecordset(R2)
     Set oRst = oDb.OpenRecordset(R3)
     Set oRst = oDb.OpenRecordset(R4)
        straQueries = Split(LIST_OF_QUERIES, ";")
        For Q = LBound(straQueries) To UBound(straQueries)
            strFileName = CurrentProject.Path & "\" & straQueries(Q) & ".xls"
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, straQueries(Q), strFileName, True
        Next
    End Sub
    avez vous une idée de ce que j'aurais pu oublier ?

    message d'erreur :

    Nom : Capture.JPG
Affichages : 910
Taille : 24,4 Ko

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Humm,

    Citation Envoyé par Argy
    Non, la méthode requiert un nom d'objet.
    Donc tu peux faire un QueryDefs qui vérifie via CurrentDB que la requête existe ou non avec une gestion d'erreur optimiste .
    Si elle existe, tu affectes la propriété SQL de l'objet sinon, tu fais un CreateQueryDefs avec le nom de ton choix et la clause SQL avec.
    Tu m'as posé la question et je t'ai repondu mais tu n'as pas mis en place ce process... L'erreur est pourtant très explicite.

    Argy

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    rebjr Ergy,

    le code suivant marche lorsqu'il s'agit d'une seule requête, mais à deux requêtes il plante au niveau de l'opération suivante : "Set oRst1 = oQdf1.OpenRecordset"
    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
     
    Sub ExportToExcelMultipleWorkbooks()
    Const LIST_OF_QUERIES As String = "R_CPA_EXT;R_CRP_EXT;R3;R4"
    Dim straQueries() As String
    Dim Q As Integer
    Dim oDb As DAO.Database
    Dim oRst As DAO.Recordset
    Dim oQdf As DAO.QueryDef
    Dim oRst1 As DAO.Recordset
    Dim oQdf1 As DAO.QueryDef
    Dim strFileName As String
     
    Set oDb = CurrentDb
    Set oQdf = oDb.QueryDefs("R_CPA_EXT")
    Set oQdf1 = oDb.QueryDefs("R_CRP_EXT")
    Set oRst = oQdf.OpenRecordset
    Set oRst1 = oQdf1.OpenRecordset
         straQueries = Split(LIST_OF_QUERIES, ";")
        For Q = LBound(straQueries) To UBound(straQueries)
            strFileName = CurrentProject.Path & "\" & straQueries(Q) & ".xls"
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, straQueries(Q), strFileName, True
     
        Next
    End Sub
    merci de me dire ce qui manque dans mon code.
    y'a til un moyen de spécifier les céllules et la feuille dans laquelle les données seront copiées avec DoCmd.TransferSpreadsheet ?

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Humm, ah, là là

    Tu n'as pas besoin de Recordset... Pourquoi vouloir ouvrir le jeu d'enregistrements ?
    Bon, voilà le code corrigé ;
    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
     
    Sub ExportToExcelMultipleWorkbooks()
    Const LIST_OF_QUERIES                                  As String = "R_CPA_EXT;R_CRP_EXT;R3;R4"
    Const SQL_OF_QUERIES                                   As String = "select * from SIBANQUE_RCAT;select * from SIBANQUE_RPEP;select * from SIBANQUE_RCIF;select * from SIBANQUE_RCRP"
    Dim straSQLQueries()                                   As String
    Dim straQueries()                                      As String
    Dim Q                                                  As Integer
    Dim oDB                                                As DAO.Database
    Dim oRst                                               As DAO.Recordset
    Dim oQdf                                               As DAO.QueryDef
    Dim strFileName                                        As String
     
        Set oDB = CurrentDb
        straQueries = Split(LIST_OF_QUERIES, ";")
        straSQLQueries = Split(SQL_QUERIES, ";")
        For Q = LBound(straQueries) To UBound(straQueries)
            'Gestion d'erreur optimiste
            On Error Resume Next
            Set oQdf = oDB.QueryDefs(straQueries(Q))
            'si la requpete n'existe pas on la créé (donc à toi d'adapter le clause SQL avec un WHERE par exemple...)
            If err <> 0 Then
                Set oQdf = oDB.CreateQueryDef(straQueries(Q), straSQLQueries(Q))
                Err.Clear
            End If
            strFileName = CurrentProject.Path & "\" & straQueries(Q) & ".xls"
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, straQueries(Q), strFileName, True
        Next
    End Sub
    Non, tu ne peux pas spécifier une plage de destinatination
    Citation Envoyé par L'aide Access sur la méthode TransferSpreadsheet
    Range Facultatif Variante
    Expression chaîne qui correspond à une plage valide de cellules ou au nom d'une plage de la feuille de calcul. Cet argument n'est valable que pour une importation. Laissez cet argument vierge pour importer la feuille de calcul entière. Lorsque vous effectuez une exportation vers une feuille de calcul, vous devez laisser cet argument vierge. Si vous tapez une plage, l'exportation échoue.
    F1 est ton ami...

    [edit]
    Pour copier les données dans un classeur spécifique et dans une feuille spécifique, il te faut procéder dans un second temps par automation avec les objets Excel idoines.
    [edit]

    Argy

  11. #11
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Youpppiiiiiiii ça marche,

    tres grand merci Argy !!!

    maintenant reste à chercher comment tout importer dans un seul fichier excel ou dans des céllules différentes d'une feuille excel.

    j'espère que j'y arriverais !!!

  12. #12
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    est ce que quelqu'un peut me dire pourquoi ce code ajouté apres l'instruction docmd.TransferSpreadSheet ne fonctionne pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'Crée une copie de la Feuil1 dans un nouveau classeur
                ActiveWorkbook.Worksheets(Q).Copy
                'Worksheets(Q).Copy
                'Sauvegarde la copie
                ActiveWorkbook.SaveAs "C:\straQueries(Q).xls"
                'Ferme le classeur sauvegardé
                ActiveWorkbook.Close True
    merci d'avance !!!

  13. #13
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ezequielfranck Voir le message
    est ce que quelqu'un peut me dire pourquoi ce code ajouté apres l'instruction docmd.TransferSpreadSheet ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'Crée une copie de la Feuil1 dans un nouveau classeur
                ActiveWorkbook.Worksheets(Q).Copy
                'Worksheets(Q).Copy
                'Sauvegarde la copie
                ActiveWorkbook.SaveAs "C:\straQueries(Q).xls"
                'Ferme le classeur sauvegardé
                ActiveWorkbook.Close True
    Merci d'ajuster ta demande avec le contexte du code que tu poste car là, on ne comprend rien...

    Argy

  14. #14
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    en fait Argy,

    le résultat du premier code me génère autant de fichiers que de requêtes. ça veut dire que si j'ai 20 requêtes, il me générera 20 fichiers excel.
    ce que je veux obtenir avec le dernier code que je viens de poster, c'est de pouvoir générer toutes ces requêtes dans des feuilles d'un même classeur et même dans des cellules précises.
    or le précédent code que je viens de coller s'éxécute bien mais ne copie pas les fichiers comme prévue. j'ai placé ce code juste après l'instruction :
    DoCmd.TransferSpreadSheet
    merci pour ton aide.

  15. #15
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Le principe est simple :
    1. Tu créés effectivement autant de classeurs qu'il y a de requêtes.
    2. Tu stockes dans un tableau de String tous les fichiers générés.
    3. Tu ouvres une instance Excel qui ouvre ton classeur cible dans un objet Workbook A
    4. Tu boucles ton tableau avec la méthode Open d'un objet Workbook B pour ouvrir tous tes classeurs un à un.
    5. Tu copies la feuille de chacun deux ou bien tu sélectionnes la page de données concernée.
    6. Tu localises la cellule cible.
    7. Tu fais un Paste via l'objet ActiveSheet
    8. Et ainsi de suite.
    9. Tu sauves
    10. Une fois fini, tu boucles de nouveau ton tableau pour lancer un Kill de chaque fichiers.
    11. C'est fini.


    Bon, ça demande un peu de réflexion quant à la mise en place mais c'est un enjeu intéressant...

    Argy

  16. #16
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 874
    Points : 3 461
    Points
    3 461
    Par défaut
    Bonjour ezequielfranck, Argy,

    Je viens de lire votre discussion
    ce que je veux obtenir avec le dernier code que je viens de poster, c'est de pouvoir générer toutes ces requêtes dans des feuilles d'un même classeur et même dans des cellules précises.
    me fait penser beaucoup plus à la deuxième solution d'Argy:
    2/ par automation instancier Excel et créer le classeur avec le nombre de feuille qui convient
    Tu pourrais ainsi choisir dans quelle feuille envoyer une requête et tu pourrais même spécifier dans quelle cellule envoyer le résultat d'un champ en particulier.

    Avec l'aide d'Access sous la rubrique: Workbook, membres de l’objet, tu auras toutes les manipulations possibles te permettant de créer un fichier Excel et de le façonner, comme créer une feuille ou la supprimer etc...

    Bonne journée

  17. #17
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    bonjour robert,

    merci pour ta contribution. j'étais hors ligne.
    mais je traine encore le pas dans le code. mais je posterai le code bientôt si cela ne marche toujours pas.

    cdt.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    bonjour Argy,

    voici mon code qui marche, mais pas comme je le souhaite. en fait il est statique, ne recopie que le dernier fichier, ne permet pas de sélectionner une feuille ...
    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
     
    Sub ExportToExcelMultipleWorkbooks1()
    Const LIST_OF_QUERIES As String = "R_CT2_EXT;R_CCO_EXT;R_CT1_EXT;R_CPA_EXT"
    'Const SQL_OF_QUERIES As String = "select * from SIBANQUE_RCAT;select * from SIBANQUE_RPEP;select * from SIBANQUE_RCIF;select * from SIBANQUE_RCRP"
    'Dim straSQLQueries() As String
    Dim straQueries() As String
    Dim Q As Integer
    Dim oDB As DAO.Database
    Dim oRst As DAO.Recordset
    Dim oQdf As DAO.QueryDef
    Dim strFileName As String
    Dim Excl As Object, Excl1 As Object
     
        Set oDB = CurrentDb
        straQueries = Split(LIST_OF_QUERIES, ";")
        straSQLQueries = Split(SQL_OF_QUERIES, ";")
        For Q = LBound(straQueries) To UBound(straQueries)
            'Gestion d'erreur optimiste
            On Error Resume Next
            Set oQdf = oDB.QueryDefs(straQueries(Q))
            'si la requpete n'existe pas on la créé (donc à toi d'adapter le clause SQL avec un WHERE par exemple...)
            If Err <> 0 Then
                Set oQdf = oDB.CreateQueryDef(straQueries(Q)) ', straSQLQueries(Q))
                Err.Clear
            End If
            strFileName = CurrentProject.Path & "\" & straQueries(Q) & ".xls"
            DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, straQueries(Q), strFileName, False
              Set Excl = CreateObject("Excel.Application")
              'Application.Workbooks.Open strFileName
              Excl.Workbooks.Open strFileName
     
                If Excl.Name <> "" Then
                    'Autres manipulation du classeur
                    Excl.Application.Visible = True
                   'Excl.Sheets(straQueries(Q)).Cells(1, 1) = "titre du document straQueries(Q)"
                    'Excl.SaveAs "c:\test_bis.xls"
                    'Excl.ActiveSheet().SaveAs "c:\test_bis.xls"
                    'Range("A1:B10").Copy Workbooks("test_bis").Worksheets("R_CCO_EXT").Range("D5")
                    Range("A1:B10").Select
                    Selection.Copy
                    Workbooks.Open "C:\test_bis.xls"
                    Windows("test_bis").Activate
                    Sheets("Feuil1").Select
                    Range("D5").Select
                    Workbooks("test_bis").Activate
                    ActiveSheet.Paste
                    'Sheets("Feuil1").Select
                    'Application.CutCopyMode = False
                    'Windows("Classeur1").Activate
     
                    Excl.Application.Quit
                    Set Excl = Nothing
     
                End If
     
        Next
    End Sub

  19. #19
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Humm, normal que cela ne tourne pas comme tu l'entends car tu n'as pas suivi le déroulement que je t'avais insrit...

    1. Tu créés effectivement autant de classeurs qu'il y a de requêtes. (via TransferSpreadsheet)
    2. Tu stockes dans un tableau de String tous les fichiers générés. (où est le tableau dans ton code ?)
    3. Tu ouvres une instance Excel qui ouvre ton classeur cible dans un objet Workbook A (où est le classeur maitre dans ton code ?)
    4. Tu boucles ton tableau avec la méthode Open d'un objet Workbook B pour ouvrir tous tes classeurs un à un. (où sont lex classeurs sources dans ton code ?)
    5. Tu copies la feuille de chacun deux ou bien tu sélectionnes la plage de données concernée. (Ne pas écrire la plage en dur ; elle est variable ; il faut user d'un objet Range qui sélectionnes la zone {UsedRange par rapport à A1})
    6. Tu localises la cellule cible. (Ne pas écrire la plage en dur ; Elle doit être variable...)
    7. Tu fais un Paste via l'objet ActiveSheet
    8. Et ainsi de suite. (La boucle for/next est réservée aux requêtes ; il ne faut aps encapsuler tout dans la même procédure ; ça se fait en 2 temps)
    9. Tu sauves. (pas vu)
    10. Une fois fini, tu boucles de nouveau ton tableau pour lancer un Kill de chaque fichiers. (pas vu)
    11. C'est fini.


    Dans ton exemple, tu instancies Excel à chaque requête, ce qui n'est pas idéal.
    Je te conseille de mettre tout sur papier et de lister chaque cas source/cible et aussi de qualifier tes objets Range, Selection, Workbooks, Sheets, Workbooks ne doivent être employés de la sorte que si tu es dans Excel or, là, ce n'est pas le cas ; le qualifiant est impératif même si ça marche sans, parfois.

    Argy

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

Discussions similaires

  1. erreur lors d'un export simple d'Access vers Excel
    Par Armagnak dans le forum Access
    Réponses: 4
    Dernier message: 18/08/2006, 09h33
  2. Export journalier Table Access vers Excel
    Par SylvainJ dans le forum Access
    Réponses: 1
    Dernier message: 04/08/2006, 15h00
  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. Problème pour exporter une table Access vers Excel
    Par PAULOM dans le forum Access
    Réponses: 22
    Dernier message: 02/05/2006, 13h42

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