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