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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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, 174 affichages)

  2. #2
    Expert confirmé
    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
    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 éprouvé
    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
    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 confirmé 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 : 72
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    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

  5. #5
    Expert confirmé
    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
    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 confirmé 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 : 72
    Localisation : France

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

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

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

    Cordialement,

    PGZ

  7. #7
    Membre éprouvé
    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
    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

+ 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