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 :

Importer une requete access sur excel


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Importer une requete access sur excel
    Bonjour à tous,

    je suis actuellement en stage. J'ai crée un programme grâce aux différentes informations obtenues sur ce forum. Je vous remercie pour cela. Le programme fonctionne assez bien lorsqu'il s'agit d'importer des tables mais pour les requêtes, il y a un message d'erreur qui apparaît: "La méthode Open de l'Objet Recordset a échoué" lors de l'ouverture du Recordset.

    Je ne sais quoi faire alors que je souhaiterais importer une Requête access sur excel dont le nomest "Global"
    Aidez-moi, SVP. Je vous remercie d'avance.

    Voilà, mon programmme:

    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
    118
    119
    120
    121
    Sub ImporterDonneesDeAccess()
    Dim X As Integer, C As Integer
    Dim cnt As New ADODB.Connection
    Dim Rst As New ADODB.Recordset
    Dim Rg As Range, Sh As Worksheet
    Dim NbEnr As Long, CheminDb As String
    Dim NomTable As String, NomFeuille As String
    Dim Tblo As Variant, Requete As String
     
    CheminDb = "I:\IMPORT DONNEE/BETA2.2.mdb"
    NomTable = "Global"
    Requete = " Select * From " & NomTable & " "
     
    'la chaîne de connexion à une base de données access
    cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & CheminDb & ";"
     
    'Ouverture du recordset
    Rst.Open Requete, cnt, adOpenStatic
     
    'Si aucun enregistrement est trouvé lors de la requête
    If Rst.RecordCount = 0 Then
        MsgBox "Aucun enregistrement trouvé." & vbCrLf & "Fin de l'opération.", vbInformation + vbOKOnly, "Annulation"
        'Ferme la connection et le recordset
        Rst.Close: cnt.Close
        'libère la mémoire vive occupéé par les objets
        Set Rst = Nothing: Set cnt = Nothing
        Set Rg = Nothing: Set Sh = Nothing
        Exit Sub
    End If
     
        'Eviter le rafraîchissement de l'écran
        Application.ScreenUpdating = False
     
        'Supprime la feuille
        Application.DisplayAlerts = False
        Worksheets("MVTS CPT Global").Delete
        Application.DisplayAlerts = True
     
        'Conserve dans une variable le nom de la feuille active.
        NomFeuille = ThisWorkbook.ActiveSheet.Name
     
     
        'Ajoute la nouvelle feuille: MVTS CPT Global où seront acheminées les données
        Set Sh = ActiveWorkbook.Worksheets.Add
        ActiveSheet.Name = "MVTS CPT Global"
     
        'détermine la cellule supérieur gauche où
        'le recordset va être copié
        With Sh
            Set Rg = .Range("A1")
        End With
     
     
        'Si tu es intéressé de récupérer directement les noms
        'des champs de ton recordset, tu peux utiliser ce
        'qui suit :
     
     
        Do
            Rg.Offset(, C) = Rst.Fields(C).Name
            C = C + 1
            X = X + 1
        Loop Until X = Rst.Fields.Count
     
     
    'Section copiant le recordset dans excel
    'La procédur va pouvoir choisir selon la version
    'd'excel d'installer laquelle des méthodes choisir.
     
     
    'Un test sur la version excel en cours ...
    If Val(Mid(Application.Version, 1, InStr(1, _
        Application.Version, ".") - 1)) > 8 Then
        'EXCEL 2000 or 2002: La méthode CopyFromRecordset
        Rg.Offset(1).CopyFromRecordset Rst
    Else
     
     
    'Détermine le nombre d'enregistrements
        'Le +1 c'est pour tenir compte du tableau qui est de
        'base 0 ... première cellule dans excel est cells(1,1)
        NbEnr = UBound(Tblo, 2) + 1
     
     
        'Transpose le tableau(tblo) pour que la première dimension
        'devienne les données et que sa présentation soit
        'conforme lorsqu'il sera copié dans Excel
        Rg.Offset(1).Resize(NbEnr, Rst.Fields.Count).Value = TransposeSpecial(Tblo)
    End If
     
     
        'Redimensionnement des cellules.
        Rg.CurrentRegion.Columns.AutoFit
        Rg.CurrentRegion.Rows.AutoFit
     
     
        'Sélection de la feuille au départ de la procédure
        Worksheets(NomFeuille).Select
     
     
         ' Ferme la connection et le recordset
         Rst.Close: cnt.Close
     
     
         'Libère la mémoire vive occupée par les objets
         Set Rst = Nothing: Set cnt = Nothing
         Set Rg = Nothing: Set Sh = Nothing
    End Sub
     
    Function TransposeSpecial(ByRef Arr As Variant) As Variant
    Dim A As Integer, B As Integer, Arr1() As Variant
    Dim C As Integer, D As Integer
        A = UBound(Arr, 1): B = UBound(Arr, 2)
        ReDim Arr1(B, A)
        For C = 0 To A
            For D = 0 To B
                Arr1(D, C) = Arr(C, D)
           Next
        Next
        TransposeSpecial = (Arr1)
    End Function

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Pour deux programmes Office, il est plus facile d'utiliser du DAO que de ADO.

    Christophe Warin a fait un super tuto sur le DOA. http://warin.developpez.com/

    Tu peux faire appel au DAO au départ d'Excel, et tu te retrouve alors dans un environnement un peu plus souple et puissant.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Importer une requête access sur excel
    Salut,

    merci pour ta réponse mais le problème ce que je ne suis pas un expert et j déjà eu du mal à faire ce programme. Existe -il une fonction qui permette de résoudre ce problème d'erreur sans pour autant modifier entièrement mon programme?

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    C'est ton chemin qui n'est pas bon

    \ et / ne font pas bon ménage.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Chemin d'accès
    J'ai modifié le chemin d'accès mais cela ne fonctionne pas.
    Chemin d'accès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheminDb = "G:\IMPORT DONNEE\BETA2.2.mdb"
    Que dois_je faire?

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Importer une requête access sur excel
    ça y est !!!!
    je vous remercie tous pour votre aide
    Le code final qui servira peut-être à d'autres est:


    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    Sub ImporterDonneesDeAccess()
    Dim X As Integer, c As Integer
    'Dim cnt As New ADOD.Connection
    'Dim Rst As New ADODB.Recordset
    Dim cnt As DAO.Database
    Dim Rst As DAO.Recordset
    Dim query As DAO.QueryDef
    Dim Rg As Range, Sh As Worksheet
    Dim NbEnr As Long, CheminDb As String
    Dim NomTable As String, NomFeuille As String
    Dim Tblo As Variant, Requete As String
     
    CheminDb = "G:\IMPORT DONNEE1\BETA2.2.mdb"
    'NomTable = "DEFI"
    'Requete = " Select * From " & NomTable & " "
     
    'la chaîne de connexion à une base de données access
    'cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & CheminDb & ";"
    Set cnt = DBEngine.Workspaces(0).OpenDatabase(CheminDb)
     
    'Ouverture du recordset
    'Rst.Open Requete, cnt, adOpenStatic
    Set query = cnt.QueryDefs("Global")
    Set Rst = query.OpenRecordset
     
    'Si aucun enregistrement est trouvé lors de la requête
    If Rst.RecordCount = 0 Then
        MsgBox "Aucun enregistrement trouvé." & vbCrLf & "Fin de l'opération.", vbInformation + vbOKOnly, "Annulation"
        'Ferme la connection et le recordset
        Rst.Close: cnt.Close
        'libère la mémoire vive occupéé par les objets
        Set Rst = Nothing: Set cnt = Nothing
        Set Rg = Nothing: Set Sh = Nothing
        Exit Sub
    End If
     
        'Eviter le rafraîchissement de l'écran
        Application.ScreenUpdating = False
     
        'Supprime la feuille
        Application.DisplayAlerts = False
        Worksheets("MVTS CPT Global").Delete
        Application.DisplayAlerts = True
     
        'Conserve dans une variable le nom de la feuille active.
        NomFeuille = ThisWorkbook.ActiveSheet.Name
     
     
        'Ajoute la nouvelle feuille: MVTS CPT Global où seront acheminées les données
        Set Sh = ActiveWorkbook.Worksheets.Add
        ActiveSheet.Name = "MVTS CPT Global"
        Sheets("MVTS CPT Global").Move after:=Sheets("EXECUTION")
     
     
        'détermine la cellule supérieur gauche où
        'le recordset va être copié
        With Sh
            Set Rg = .Range("A1")
        End With
     
     
        'Si tu es intéressé de récupérer directement les noms
        'des champs de ton recordset, tu peux utiliser ce
        'qui suit :
        c = 0
     
        Do
            Rg.Offset(, c) = Rst.Fields(c).Name
            c = c + 1
            X = X + 1
        Loop Until X = Rst.Fields.Count
     
     
    'Section copiant le recordset dans excel
    'La procédur va pouvoir choisir selon la version
    'd'excel d'installer laquelle des méthodes choisir.
     
     
    'Un test sur la version excel en cours ...
    If Val(Mid(Application.Version, 1, InStr(1, _
        Application.Version, ".") - 1)) > 8 Then
        'EXCEL 2000 or 2002: La méthode CopyFromRecordset
        Rg.Offset(1).CopyFromRecordset Rst
    Else
     
     
    'Détermine le nombre d'enregistrements
        'Le +1 c'est pour tenir compte du tableau qui est de
        'base 0 ... première cellule dans excel est cells(1,1)
        NbEnr = UBound(Tblo, 2) + 1
     
     
        'Transpose le tableau(tblo) pour que la première dimension
        'devienne les données et que sa présentation soit
        'conforme lorsqu'il sera copié dans Excel
        Rg.Offset(1).Resize(NbEnr, Rst.Fields.Count).Value = TransposeSpecial(Tblo)
    End If
     
     
        'Redimensionnement des cellules.
        Rg.CurrentRegion.Columns.AutoFit
        Rg.CurrentRegion.Rows.AutoFit
     
     
        'Sélection de la feuille au départ de la procédure
        Worksheets(NomFeuille).Select
     
     
         ' Ferme la connection et le recordset
         Rst.Close: cnt.Close
     
     
         'Libère la mémoire vive occupée par les objets
         Set Rst = Nothing: Set cnt = Nothing
         Set Rg = Nothing: Set Sh = Nothing
     Call fillForm
    End Sub
    '------------------------------------------
     
     
    'Fonction requise par la procédure pour les
    'versions antérieures à excel 200
     
     
    '------------------------------------------
    Function TransposeSpecial(ByRef Arr As Variant) As Variant
    Dim A As Integer, B As Integer, Arr1() As Variant
    Dim c As Integer, D As Integer
       'A = UBound(Arr, 1): B = UBound(Arr, 2)
        ReDim Arr1(B, A)
        For c = 0 To A
            For D = 0 To B
                Arr1(D, c) = Arr(c, D)
           Next
       Next
        TransposeSpecial = (Arr1)
     
    End Function

Discussions similaires

  1. [AC-2010] Importation d'une requête Access sur Excel
    Par jurta dans le forum Access
    Réponses: 22
    Dernier message: 22/11/2013, 08h57
  2. [AC-2007] afficher une requête access sur excel automatiquement
    Par marco_t dans le forum Access
    Réponses: 1
    Dernier message: 01/10/2010, 13h57
  3. Impossible d'importer une requete Access sur SAS
    Par thiblightt dans le forum SAS Base
    Réponses: 1
    Dernier message: 08/08/2008, 09h39
  4. Affichage dynamique d'une requete Access dans Excel
    Par alex830001 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/06/2008, 16h54
  5. Récuperation d'une valeur d'une requete access depuis excel
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/04/2008, 11h15

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