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 :

ADODB Recordset.Getrows renvoie des null à la place de certaines valeurs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Le Sage
    Homme Profil pro
    Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Inscrit en
    Novembre 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2009
    Messages : 218
    Par défaut 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 : 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.

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    Bonsoir,
    Excel ne connait pas le typage des colonne, en revanche Adodb a besoin de ce typage.

    adodb va opérer ce typage par apprentissage il regarde ce qui ce trouve sur chaque ligne et comme je présume que ImporterEntetes= true tu affecte HDR=No à ta connexion donc tous tes champs sont des string
    Référence Libellé Qté Transport PUHT
    , ce qui implique les valeur numérique, booléenne, date ce trouve = nul.

    si HDR=YES alors adodb trouverait Qté=integer; PUHT =double car la zone de titre de colonne ne serait pas prise en compte.

    il faut ajouter IMEX=1 pourun typage indéfini, en revanche la connexion passe en lecture seule mais pour ce qui te préoccupe c'est les valeur du recordset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function Requete(ByVal FichierSource As String, _
                         ByVal FeuilleSource As String, _
                         Optional ByVal ImporterEntetes As Boolean)
     
     With New ADODB.Connection
         .ConnectionString =  "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                   & FichierSource & ";Extended Properties=""Excel 12.0;HDR=" & IIf(ImporterEntetes, "No", "Yes") & ";IMEX=1"""
         .Open
         Requete = Transpose(.Execute("SELECT TOP 1 * FROM [" & FeuilleSource & "$]").GetRows) 'TOP 1 que la ligne de titre?
         .Close
     End With
    End Function

  3. #3
    Membre éclairé Avatar de Le Sage
    Homme Profil pro
    Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Inscrit en
    Novembre 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2009
    Messages : 218
    Par défaut
    Bonsoir Thum down.

    Effectivement, mon besoin ne va que dans le sens de la lecture de la source, et l'ajoute de IMEX=1 dans la chaîne de connexion semble résoudre le problème.

    Un grand merci donc pour cette info qui me permet de mettre de finaliser mon projet.

    En revanche, j'aimerais bien savoir où m'instruire sur le sujet car je déteste utiliser sans comprendre... donc si en prime tu avais des pistes qui me permettraient de mieux comprendre ce genre de finesse, je saurais en faire bon usage

    Encore merci de t'être penché sur mon problème et encore plus d'y avoir apporté une solution concrète.
    Bonne journée.

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561

  5. #5
    Membre éclairé Avatar de Le Sage
    Homme Profil pro
    Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Inscrit en
    Novembre 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur Conseil en Bureautique et CMS, Développeur VBA, Power Query, Power Pivot
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2009
    Messages : 218
    Par défaut
    Je l'avais lu il y a bien longtemps... et il répond effectivement à mes interrogations. Je ne devais pas encore être capable d'en tirer profit.

    Merci encore, bonne continuation et au plaisir.

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

Discussions similaires

  1. [XL-2016] VBA / ADODB Recordset Count renvoi -1
    Par axis60 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 01/08/2018, 15h47
  2. [Core] Merge renvoi des id null
    Par Alec6 dans le forum Hibernate
    Réponses: 12
    Dernier message: 12/04/2012, 22h50
  3. Réponses: 2
    Dernier message: 04/01/2007, 13h31
  4. Recordset vide alors que la requete renvoie des valeurs
    Par lepiou dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/06/2006, 10h36
  5. Réponses: 5
    Dernier message: 11/12/2003, 14h45

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