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 :

GetRows : Récupérer le contenu d'un RecordSet ADO dans un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut GetRows : Récupérer le contenu d'un RecordSet ADO dans un tableau
    Bonjour,

    j'ai un problème avec l'utilisation de la méthode GetRows des RecordSet ADO (et non DAO, j'ai pas bien compris pourquoi il y a deux types de RecordSet et les différences d'ailleurs...).

    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
    Option Explicit
    Option Base 1
    
    Sub toto()
        'Déclaration des variables
        Dim connexion As ADODB.Connection
        Dim monRecordSet As ADODB.Recordset
        Dim Base As String
        
        'Instanciation des variables
        Set connexion = New ADODB.Connection
        Set monRecordSet = New ADODB.Recordset
        Base = "Base.xlsm"
        
        'Paramètres de l'objet connexion
        connexion.Provider = "Microsoft.Jet.OLEDB.4.0"
        connexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Base + ";Extended Properties=""Excel 12.0;HDR=YES;"""
        connexion.Open
        
        'Paramètres de l'objet RecordSet
        monRecordSet.CursorLocation = adUseServer
        monRecordSet.ActiveConnection = connexion
        
        'Requête
        monRecordSet.Open "SELECT * FROM [PX_LAST] WHERE NOT(Date=0)", , adOpenStatic, adLockOptimistic
        
        Debug.Print monRecordSet.EOF
        monRecordSet.MoveLast                      'Les méthodes MoveLast et MoveFirst servent juste à pouvoir utiliser
        monRecordSet.MoveFirst                     'RecordCount ensuite (sinon, les deux commandes s'annulent)
        Debug.Print monRecordSet.RecordCount
        Range("A1").CopyFromRecordset monRecordSet
        'Tableau
        Dim monTableau As Variant
    '    monTableau = Range(Range("A1"), Range("A1").End(xlDown).Offset(0, 1)).Value
        monTableau = monRecordSet.GetRows(20)
        Debug.Print monTableau(1, 2)
        
        
        connexion.Close
        Set connexion = Nothing
    End Sub
    Voici ce qu'est supposé faire mon code : j'ai une base de données sous forme de fichier Excel ("Base.xlsm"). Dans ce fichier, j'ai une plage nommée (PX_LAST) qui contient les données que je souhaite extraire. Je fais ma requête SQL et tout fonctionne bien. Mon RecordSet contient les données voulues, je peux même les copier dans un Range grâce à la méthode CopyFromRecordSet(). Seulement, je souhaite stocker mes données dans un tableau. J'utilise donc la méthode GetRows, mais mon code bloque sur la ligne en gras. J'obtiens l'erreur :

    Erreur d'exécution '3021': Erreur définie par l'application ou par l'objet

    A noter que j'arrive à faire ce que je souhaite faire via la ligne en italique (mise en commentaire) :

    monTableau = Range(Range("A1"), Range("A1").End(xlDown).Offset(0, 1)).Value

    Mais c'est de la bricole et j'aimerais éviter de passer par une copie dans les cellules.

    Est-ce que quelqu'un a une piste ?

    Je vous remercie

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Sans chercher plus loin, as-tu essayé avec "Set" ? Car pour initialiser un objet, il faut utiliser l'instruction "Set" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set monTableau = monRecordSet.GetRows(20)
    Hervé.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    Non, ce n'est pas ça. Sinon, la ligne qui affecte les valeurs au tableau via le Range ne fonctionnerait pas.

    J'ai tout de même testé ta solution, mais j'ai exactement la même erreur.

    Une info qui peut aider, c'est que ma première colonne contient des dates quand la seconde contient des chiffres. Je ne sais pas si ça peut venir de ça.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Je me suis penché sur ton code et je pense que la commande "Range("A1").CopyFromRecordset monRecordSet" est responsable en mettant EOF à True donc, soit tu inverse les commandes mais dans ce cas tu ne récupèreras que tes 20 lignes, soit tu mets cette commande en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim monTableau As Variant
        monTableau = monRecordSet.GetRows(20)
        Debug.Print monTableau(1, 2)
        Range("A1").CopyFromRecordset monRecordSet
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Range("A1").CopyFromRecordset monRecordSet 'mettre en commentaire pour tester !
    Dim monTableau As Variant
    monTableau = monRecordSet.GetRows(20)
    Debug.Print monTableau(1, 2)
    Hervé.

  5. #5
    Invité
    Invité(e)
    Par défaut Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Range("A1").CopyFromRecordset monRecordSet 'mettre en commentaire pour tester !
    Dim monTableau As Variant
    monRecordSet.requery ' ou monRecordSet.movefirst
    monTableau = monRecordSet.GetRows(20)
    Debug.Print monTableau(1, 2)
     
    NbLigne = 1
    NnCol = 0
    montable = Rec.GetRows(NbLigne, NnCol)

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    Bonjour,

    je vous remercie tous les deux. Effectivement, c'est bien l'explication que tu donnes Theze qui est juste : lorsque j'utilise CopyFromRecordSet, la propriété EOF passe à True et on ne peut plus utiliser GetRows.

    Mon problème est résolu, je vous remercie

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/04/2011, 20h39
  2. Réponses: 3
    Dernier message: 26/01/2009, 20h31
  3. VBA Récupérer le contenu d'un fichier texte dans un champs
    Par sperchey dans le forum VBA Access
    Réponses: 7
    Dernier message: 17/06/2008, 14h05
  4. Récupérer le contenu d'un fichier texte dans une variable
    Par heureactuelle dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/05/2008, 15h10
  5. Comment récupérer le contenu d'un doc Word dans un txt en VB
    Par thierry007 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 23/09/2006, 15h17

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