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 : 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
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.
ça n'étonnera personne si je trouve ça gênant ?

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