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 :
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 :
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
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
Partager