ADODB Recordset.Getrows renvoie des null à la place de certaines valeurs
Bonjour à toutes et tous !
Tout d'abord, histoire de poser le contexte et d'être le plus précis possible, voici une version épurée et minimaliste du code qui me pose problème. J'ai testé celle-ci, avec les mêmes résultat que l'originale (dont les détails, du coup, sont inutile à résoudre l'énigme) :
Code:
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
| Public Function Requete(ByVal FichierSource As String, _
ByVal FeuilleSource As String, _
Optional ByVal ImporterEntetes As Boolean)
Dim adoConnexion As ADODB.connection
Dim adoRst As ADODB.Recordset
Dim strSql As String
Set adoConnexion = New ADODB.connection
With adoConnexion
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0" & _
";Data Source=" & FichierSource & _
";Extended Properties=""Excel 12.0" & _
";HDR=" & IIf(ImporterEntetes, "No", "Yes") & ";"""
.Open
End With
strSql = "SELECT TOP 1 * FROM [" & FeuilleSource & "$]"
Set adoRst = adoConnexion.Execute(strSql)
Requete = Transpose(adoRst.GetRows)
End Function
Private Function Transpose(Recordset As Variant) As Variant
' Libère du contexte Excel, et pallie les problèmes générés par WorkseetFunction.Transpose() sur les valeurs Null
Dim I As Long, j As Long
ReDim varTransposed(LBound(Recordset, 2) To UBound(Recordset, 2), LBound(Recordset, 1) To UBound(Recordset, 1))
For I = LBound(Recordset, 1) To UBound(Recordset, 1)
For j = LBound(Recordset, 2) To UBound(Recordset, 2)
varTransposed(j, I) = Recordset(I, j)
Next
Next
Transpose = varTransposed
End Function |
Mon problème est que certains champs remontent à Null alors qu'ils ne le sont pas, notamment lorsque je n'importe que la ligne d'entêtes.
En creusant, il apparaît que ce sont les entêtes de champs dont la priorité Recordset.Fied.Type = adDouble, autrement dit tous les champs contenant des valeurs numériques. 8O :cfou:
ça n'étonnera personne si je trouve ça gênant ? :koi:
Pour mieux comprendre, imaginons la source Excel suivante :
|
A |
B |
C |
D |
E |
1 |
Référence |
Libellé |
Qté |
Transport |
PUHT |
2 |
XW254G4 |
Tarte à la Rouille |
3 |
Oui |
12,3 |
La requête va renvoyer :
- Référence
- Libellé
- Null
- Transport
- Null
Je me dis que c'est peut-être un problème de fournisseur (Connexion.Provider), mais j'ai cherché des heures et je n'ai rien trouvé de ce côté (ce qui n'exclue pas que j'ai mal cherché). J'aimerais bien, au-delà de la résolution de ce souci, que quelqu'un qui connait les différents fournisseurs compatibles me rencarde (et par la même occasion la communauté) sur le sujet.
Afin d'éviter à chacun de s'investir dans des solutions hors de mes attentes, merci de noter que je connais Power Query et que je développe autant en M qu'en VBA, et que c'est donc une solution basée sur l'exécution d'une requête SQL (type ADODB) que recherche et non un contournement utilisant une autre méthode.
Donc pour résumer et être précis :
Citation:
Je voudrais récupérer dans une Variant() certaines données d'un classeur fermé sans passer par Power Query, si possible sur la base du code ci-dessus. La solution doit pouvoir fonctionner sous W10 x64, packs Office 2007 > 365
Merci par avance à quiconque saura contribuer de manière constructive à ce message.