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

Macros et VBA Excel Discussion :

Erreur - Récupérer table Access dans Excel [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Rémy.A
    Homme Profil pro
    Expert SEE ELECTRICAL EXPERT
    Inscrit en
    Juin 2017
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert SEE ELECTRICAL EXPERT
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 118
    Par défaut Erreur - Récupérer table Access dans Excel
    Bonjour à tous,


    je viens vers vous car j'ai une erreur que je n'arrive pas à résoudre seul...

    J'ai réalisé une macro qui importe les tables Access et qui les insert dans Excel, mais au moment de la copie j'ai une erreur : la méthode CopiFromRecordset de l'objet range a échoué...

    Lorsque j'appuie sur débogage puis F5 le message revient je re clique sur débogage puis F5 et je recommence, la macro continue est la copie de la table est bon!!

    Est-ce que cela est dû au fait qu'il y a des champs nul/vide dans la table Access?

    Existe-il une solution?

    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
     
     
    'Déclaration variables public 
     
    Public Cn As ADODB.Connection
    Public rs As ADODB.Recordset
    Public strCn As String
     
    Public CheminAccess As String
    Public i As Long                           'C'est un compteur pour faire la boucle en f(j)
    Public j As Long                           'C'est un compteur pour lister les table
    Public k As Integer                        'C'est un conteur pour les feuilles Excel
    Public x As Long                           'C'est un compteur pour les trois fichiers
    Public y As Long                           'C'est un compteur pour inserer les ligne
    Public Table As String                     'Nom de la table Access
    Public CheminF1 As String                  'Chemin du fichier mdb V3R7
    Public CheminF2 As String                  'Chemin du fichier mdb V4R1
    Public CheminF3 As String                  'Chemin du fichier mdb V4R2
    Public Derniere_ligne As Long
    Public FichierExcel As String
    Public chemin As String                    'Chemin du fichier Excel
    Public Chemin1 As String                   'Chemin du fichier mdb V3R7
    Public Chemin2 As String                   'Chemin du fichier mdb V4R1
    Public Chemin3 As String                   'Chemin du fichier mdb V4R2
    Public Fichier1 As String                  'Fichier mdb V3R7
    Public Fichier2 As String                  'Fichier mdb V4R1
    Public Fichier3 As String                  'Fichier mdb V4R2
    Public Feuille1 As String                  'Feuille pour déclarer la table principale
    Public Feuille2 As String                  'Feuille pour déclarer la table temporaire
    Public Cel As Range                        'Plage de selection de comparaison
    Public cellule As String                   'Contenu de la cellule
     
     
    Public Declare Function GetTickCount& Lib "kernel32" ()
     
     
    Sub Import_AccessData()
     
     
     
     
    FichierExcel = ActiveWorkbook.Name
    Workbooks(FichierExcel).Activate
    Sheets("Feuil1").Select
    Chemin1 = Range("D8")
    Chemin2 = Range("D9")
    Chemin3 = Range("D10")
    Fichier1 = Range("D13")
    Fichier2 = Range("D14")
    Fichier3 = Range("D15")
    CheminF1 = Chemin1 & "\" & Fichier1
    CheminF2 = Chemin2 & "\" & Fichier2
    CheminF3 = Chemin3 & "\" & Fichier3
    chemin = ActiveWorkbook.Path & "\" & FichierExcel
     
     
     
     
    Sheets("Feuil1").Select
    Cells(Cells.Columns.Count, 1).End(xlUp).Select 'Permet de déterminer la dernière cellule vide de la colonne 1
     
    j = ActiveCell.Row 'permet de récupérer le N° de ligne dans la variable j
     
    For i = 8 To j 'Boucle pour récupérer les noms des tables à extraire vers Excel
            Sheets("Feuil1").Select
            Table = Range("A" & i)
     
            For x = 1 To 3 'Boucle pour récupérer les les tables à extraire vers Excel des 3 fichiers
     
                    If x = 1 Then
                        CheminAccess = CheminF1
                    End If
                    If x = 2 Then
                        CheminAccess = CheminF2
                    End If
                    If x = 3 Then
                        CheminAccess = CheminF3
                    End If
     
                    ' Connection à la base Access
                    Set Cn = New ADODB.Connection
                    strCn = "Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & CheminAccess & ";"
                    Cn.Open strCn
                    ' Ouverture recordset / table
                    ' Objet Recordset représente les enregistrements d'une table
                    Set rs = New ADODB.Recordset
                    rs.Open "SELECT * FROM" & "[" & Table & "]", Cn, adOpenKeyset, adLockOptimistic
     
                    'On colle les valeur sur la feuille "Communs" pour faire la base de recherche.
                    FichierExcel = ActiveWorkbook.Name
                    Workbooks(FichierExcel).Activate
                    Sheets("COMMUNS").Select
                    Cells(Cells.Columns.Count, 1).End(xlUp).Select
                    If x <> 1 Then
                        ActiveCell.Offset(1, 0).Select
                    End If
     
                   Selection.CopyFromRecordset rs
     
                   ' Fermeture recordset et connection
                    rs.Close
                    Set rs = Nothing
                    Cn.Close
                    Set Cn = Nothing
     
                    If x = 1 Then
                        Sheets("V3R7").Select
                    End If
                    If x = 2 Then
                        Sheets("V4R1").Select
                    End If
                    If x = 3 Then
                        Sheets("V4R2").Select
                    End If
     
                    ' Connection à la base Access
                    Set Cn = New ADODB.Connection
                    strCn = "Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & CheminAccess & ";"
                    Cn.Open strCn
                    ' Ouverture recordset / table
                    ' Objet Recordset représente les enregistrements d'une table
                    Set rs = New ADODB.Recordset
                    rs.Open "SELECT * FROM" & "[" & Table & "]", Cn, adOpenKeyset, adLockOptimistic
     
                    Workbooks(FichierExcel).Activate
                    Cells(Cells.Columns.Count, 1).End(xlUp).CopyFromRecordset rs
     
                    ' Fermeture recordset et connection
                    rs.Close
                    Set rs = Nothing
                    Cn.Close
                    Set Cn = Nothing
             Next x
     
    Next i

    Merci part avance pour votre aide

    Cordialement
    Rémy

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Comme on ne sait jamais vraiment ce qui se cache sous "Selection", on va commencer par lever les ambigüités en virant des Select/Selection.

    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    Cells(Cells.Columns.Count, 1).End(xlUp).Select
                    If x <> 1 Then
                        ActiveCell.Offset(1, 0).Select
                    End If
     
                   Selection.CopyFromRecordset rs
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim RDest As Range
                    Set RDest = Cells(Cells.Columns.Count, 1).End(xlUp)
                    If x <> 1 Then Set RDest = RDest.Offset(1, 0)
                    RDest.CopyFromRecordset rs
    D'une manière générale, la plupart des Select/Selection de ton code devraient être virés.

  3. #3
    Membre confirmé Avatar de Rémy.A
    Homme Profil pro
    Expert SEE ELECTRICAL EXPERT
    Inscrit en
    Juin 2017
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert SEE ELECTRICAL EXPERT
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 118
    Par défaut Erreur - Récupérer table Access dans Excel
    Bonjour Menhir,

    Merci pour la réponse, j'ai remplacé les lignes de code et il y a toujours la même erreur.

    Oui je vais essayer de virer les selection, faut-il que je les remplace par des Activate et ActiveCell?
    Par exemple si je remplace un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("COMMUNS").Select
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sheets("COMMUNS").Activate
    Est-ce bien?

    Je ne connais pas Access... En cherchant j'ai vu qu'il existe une fonction Nz(), est-ce que tu l'as connais?

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Rémy.A Voir le message
    Oui je vais essayer de virer les selection, faut-il que je les remplace par des Activate et ActiveCell?
    Est-ce bien?
    Ca revient au même.

    Il vaut mieux soit enchainer les référence du style Workbook.Worksheet.Range.Méthode que de faire
    Workbook.Select
    Worksheet.Select
    Range.Select
    Selection.Methode

    C'est plus propre pour le codage, c'est plus rapide pour l'exécution et c'est plus agréable visuellement (on n'a pas l'effet saccadé produit par les Select successifs).
    Quand ce n'est pas possible, le plus propre est de passer par une variable comme je l'ai fait dans le code que je t'ai transmis.

    En plus, Selection est un terme ambigu : on ne sait pas si c'est une cellule ou une feuille (entre autre), ce qui peut être une source d'erreur en cas de méthode ou propriété aux noms identiques mais ayant des effets différents sur les deux types d'objet.
    Personnellement, je ne fait jamais un Select sur un Range, sauf pour faire un placement en fin de code sur un objet créé.

    Je sais que l'enregistreur automatique de macro en met partout mais ce n'est pas un exemple à suivre.

    Pour en revenir à ton problème, il semble évident que le code lui-même n'est pas en cause. Il s'agit sans doute d'un problème avec les données.
    Il faudrait que tu identifies les données qui posent problème et que tu places un test dans le code pour éviter que l'erreur soit générée.


    En cherchant j'ai vu qu'il existe une fonction Nz(), est-ce que tu l'as connais?
    Non, je ne connais pas.

  5. #5
    Membre confirmé Avatar de Rémy.A
    Homme Profil pro
    Expert SEE ELECTRICAL EXPERT
    Inscrit en
    Juin 2017
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert SEE ELECTRICAL EXPERT
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 118
    Par défaut Erreur - Récupérer table Access dans Excel
    Merci pour les explications!

    Je ne suis pas développeur... Je suis débutant en VBA mais j'aime travailler dans "Les règles de l'art"!!
    Je vais reprendre mon code pour qu'il soit bien fait!!

    Ok je vais essais d’exécuter mon code avec une nouvelle base Access pour voir si j'ai toujours l'erreur
    Il me semble que dans la table Access, il y a des valeur au format date et binaire en plus du texte, C'est peut être ça..

  6. #6
    Membre confirmé Avatar de Rémy.A
    Homme Profil pro
    Expert SEE ELECTRICAL EXPERT
    Inscrit en
    Juin 2017
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert SEE ELECTRICAL EXPERT
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 118
    Par défaut
    Bonjour,

    J'ai développé et testé la macro sur excel 2016, je viens de m’apercevoir que j 'ai eu cette erreur quand je les testé au travail (office 2010)...

    Est-ce que cela viens des références à activer?

    Voici les référence activées sur mon PC
    Nom : Capture.PNG
Affichages : 172
Taille : 11,3 Ko

    Esct-ce qu'il y une autre référence pour Excel 2010 et ou 2013?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/11/2013, 00h20
  2. Importer des données d'une table Access dans Excel
    Par moussss86 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2013, 10h30
  3. Insertion d'une table Access dans Excel
    Par acaly dans le forum IHM
    Réponses: 1
    Dernier message: 26/11/2009, 19h23
  4. Problème exportation table Access dans Excel
    Par Thiazung dans le forum Access
    Réponses: 5
    Dernier message: 02/10/2006, 17h12
  5. [VBA Excel] Importer des tables Access dans Excel
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/12/2005, 11h44

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