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 :

Pb : Méthode ADO : ne rapatrie pas toutes les données


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut Pb : Méthode ADO : ne rapatrie pas toutes les données
    Bonjour,

    J'utilise assez souvent la méthode ADO (merci au tuto de Silkyroad), mais là, j'ai un souci : il ne rapatrie pas toutes les données, et je ne comprends pas pourquoi.....Ma macro est dans un classeur ("Monclasseur"), et je dois extraire les données du classeur "Tot" :

    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
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Documents and Settings\Administrateur\Bureau\Tot.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "S 2"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
     
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit l
        Range("A2").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Je mets en pièce jointe une partie de mon fichier. Donc, quand je lance la macro, il ne récupère pas les données (enfin pas toutes) de la colonne B.

    Quelqu'un pourrait me dire ce qui se passe ? et/ou pourquoi ça ne fonctionne pas ?

    Merci,

    A+
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls Tot.xls (30,5 Ko, 149 affichages)

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Tu as des champs vides (cellules) dans la colonne B c'est pour cela que ça ne fonctionne pas.

    Hervé.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci Theze,

    Donc, si je comprends, à partir du moment où il y a un cellule vide, la méthode ADO ne fonctionne pas ?

    Je risque donc de devoir utiliser une boucle à partir de "Monclasseur" et boucler sur toutes les cellules de "Tot" pour récupérer les données .... galère.....j'espérais qu'il y ait une autre solution......

    Confirme-me moi juste si j'ai bien compris...avant que je me lance dans un code.....

    merci,
    A+

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Les premières lignes sont utilisées pour identifier le type du champ. Si ce travail échoue, le champ entier est ignoré et en résultat ce champ est absent du rst. C'est ton cas?
    Plus bas, les vides ne posent pas de pb. Je ne sais pas combien sont ces "premières lignes".

    Mais si tu n'es pas dans ce cas, ...

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Je viens de faire des essais et là, il me retourne les valeurs des deux colonnes avec les enregistrements vides ? Teste pour voir mais fait attention de formater le moins possible ton fichier source comme par exemple les retours à la ligne dans les cellules (chose qui ne peut se faire dans Access) :
    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
     
    Sub Test()
     
        Dim ConnectCL As ADODB.Connection
        Dim Rs As ADODB.Recordset
        Dim Champ As ADODB.Field
        Dim Fichier As String
        Dim NomFeuille As String
     
        Fichier = "D:\Tot.xls"
     
        NomFeuille = "S 2"
     
        'ouvre la connexion
        Set ConnectCL = New ADODB.Connection
        ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                       "Data Source=" & Fichier & ";" & _
                       "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 2;"""
     
        Set Rs = New ADODB.Recordset
     
        With Rs
     
            .CursorType = 1
            .LockType = 3
            .Open "SELECT * FROM `" & NomFeuille & "$` ", ConnectCL
     
            .MoveFirst
     
        End With
     
        ActiveSheet.Range("A1").CopyFromRecordset Rs
     
        'ferme la connexion
        ConnectCL.Close
     
     
        Set Rs = Nothing
        Set ConnectCL = Nothing
     
    End Sub
    Hervé.

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir Theze.

    Attention à car la source a une ligne de titres.
    Mais si ça marche, ...

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci Theze,
    Merci PGZ,

    Désolé pour le retard, mais comme je suis sur MAC, il faut que je me déconnecte, reconnecte en Win, teste, revient, etc....
    Alors oui, PGZ, une fois de plus tu avais raison, si la première cellule renseignée (pas le champ) est vide tout le reste est vide, j'ai fait le test en déplaçant une date et en la mettant en B2, ça fonctionnait.

    Par contre, j'ai testé ton code Theze, il ne fonctionnait pas ...

    Néanmoins, en essayant de le tester, j'ai pris une de tes idées (IMEX) et je l'ai mixé avec le code initial :
    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
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        fichier = "C:\Documents and Settings\Administrateur\Bureau\Tot.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "S 2"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
          Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & fichier & ";" & _
            "Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
     
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Range("A1").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    et.....ça fonctionne !!!!

    Donc, combinaison de Hdr=No + IMEX=1, tout va béné béné

    Merci à tous les 2, une fois de plus, je commence à mieux comprendre certains fonctionnements VBA

    Merci et A+ pour de prochaines aventures

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Heureux que tu es pus faire ce que tu désirais. Une petite précision :
    HDR = YES ou NO; entêtes de colonnes ou non
    IMEX = 1 lecture seule, 2 lecture/écriture

    Hervé.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Ok, merci Theze pour les précisions

    Au moins j'ai compris la signification de IMEX.....

    Merci,

    A+ pour de prochaines aventures

  10. #10
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Avec IMEX = 1, s'il y a conflit de type, c'est le type texte qui est choisi, alors que tu as des dates.
    Avec HDR = No, tu considères que la première ligne c'est déjà des valeurs, alors que ce sont des titres.
    Le .copyFromRecordset masque un peu les choses. Si tu ne fais rien de plus, ce n'est pas grave. Mais si tu utilises le jeu d'enregistrement tu vas avoir sur le premier enregistrement les noms des champs et non pas les valeurs.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci PGZ,

    Lors de mes tests, j'ai fait des essais avec HDR=NO et comme j'avais des colonnes vides, j'ai essayé en mettant IMEX=1, et là, les dates apparaissaient....mais je pense que j'ai de la "chance" : le fichier d'où je rapatrie mes données, "interprète" les dates comme du texte, d'où certaines difficultés que j'ai eu à une certaine époque (http://www.developpez.net/forums/d10...es-date-vides/), donc, la combinaison fonctionne.....

    Mais je te remercie pour cette alerte, car j'ai un autre fichier, qui lui, reprend le format date, donc il va falloir que j'enlève IMEX dans le code que j'utiliserai pour rapatrier ce fichier.

    Merci à toi, Une fois de plus !!!

    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2013, 17h10
  2. [2005] SSRS ne m'affiche pas toutes les données
    Par soazig dans le forum SSRS
    Réponses: 2
    Dernier message: 13/12/2011, 19h33
  3. Un slot qui ne récupère pas toutes les données
    Par bilou_2007 dans le forum Débuter
    Réponses: 0
    Dernier message: 18/04/2011, 22h03
  4. [MySQL] Liste déroulante php/sql n'affichant pas toutes les données.
    Par Nicolas_k dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/02/2010, 13h01
  5. Réponses: 11
    Dernier message: 04/05/2006, 11h50

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