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 :

Récupération de données EXCEL sous VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Récupération de données EXCEL sous VBA
    Bonjour à tous.

    J'ai (forcément) un problème EXCEL sous VBA

    Quand j'utilise ces quelques lignes de code:

    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
    Dim ConnectionString As String
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
     
     
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
     
     
        ConnectionString = "Driver={Microsoft Excel Driver (*.xls)}; "
        ConnectionString = ConnectionString + "dbq=" & Application.ActiveWorkbook.FullName & "; "
        ConnectionString = ConnectionString + "ReadOnly=False;"
     
     
        cn.Provider = "MSDASQL"
        cn.ConnectionString = ConnectionString
        cn.Open
        rs.CursorLocation = adUseClient
        rs.Open "SELECT '" & Columns(1).Select & "' FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
     
        MsgBox rs.RecordCount
     
     
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = Nothing
    Je me retrouve avec un recordset ou il y a le bon nombre d'enregistrement quand je fait rs.recordcount.

    Le problème est que quand je regarde les données dans le rs.fields(0).value, je me retrouve avec toutes les données identiques "vrai" au lieu d'avoir une année ("2009" au format texte).

    Merci d'avance aux personnes qui se pencheront sur mon problème.

    A+

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Dans ton code, je ne vois pas de boucle pour passer en revu chaque ligne de données de ton recordset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    rs.Open "SELECT '" & Columns(1).Select & "' FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
     
    Do while not rs.EOF
     
        msgbox rs.fields(0).value
        rs.movenext
     
    Loop
     
     
    rs.Close

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonsoir jfontaine.

    Effectivement, je l'ai supprimé lors de la recherche du problème, mais toutes les valeurs dans le recordset son à "vrai".

    J'ai testé de faire le recordset sur une colonne vide, est il me dit qu'il est BOF ou EOF, donc bien vide.

    Apparemment, il détecte bien qu'il y a des valeurs et le nombre de lignes, mais j'ai l'impression qu'il teste si la valeur est vide ou non (comme pour un type booléen).

    Merci de te pencher sur mon cas.

    a+

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Je ne comprends pas cette syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT '" & Columns(1).Select & "'
    Personnellement, si je ne dois pas ramener tous les champs dans le Recordset, j'énumère les entêtes de colonnes dont j'ai besoin.
    Example avec un seul champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT [Numéro] FROM [MaFeuille$]"

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut.

    Est-tu certain(e) de l'indice de la colonne du combobox? Tu pourrais t'en assurer avec

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Salut.

    AlainTech: si je mets l'indice 1 pour la colonne, il me ressort 1 pour toutes les valeurs, si je mets entre crochés "[1]" j'ai droit a une message 'trop peut de paramètre, 1 attendu"

    Pierre Fauconnier: en mettant en .name, j'ai la valeur suivante: Expr1000 pour toutes les valeurs.

    Pour infos (au cas ou), je cherche à récupérer toutes les valeurs de la colonne sélectionnée, a savoir aussi que la cellule1 est fusionnée avec d'autres pour l'intitulé de la feuille, et dans la cellule 2 un simple texte pour dénominer la colonne.

    Une autre info, si je mets "Select * FROM ...." je récupère bien les valeurs, mais je ne peux pas tout prendre car il y a 10 000 enregistrements sur 8 colonnes dans une feuille que je doit comparer à 6 000 enregistrements sur 10 colonnes d'une autre feuille.

    Merci pour l'aide

    a+

    pour info excel 2003 pro SP2

  7. #7
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Peut etre qu'en nommant ton champ avec un alias

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    rs.Open "SELECT '" & Columns(1).Select & "' as Nom FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
     
    Do while not rs.EOF
     
        msgbox rs!Nom
        rs.movenext
     
    Loop
     
     
    rs.Close

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Salut jfontaine

    Je viens de tester, mais ca me retourne toujours "vrai".

    suis maudit

    a+..............;snif

  9. #9
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    Sans garantie, tu peux essayer de convertir ton champ en date ou en string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Open "SELECT CDATE('" & Columns(1).Select & "') FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
    CSTR(tonchamp) pour conversion en string

    @+

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Open "SELECT '" & Columns(1).Select & "' FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
    Que veux tu Select From Retour UPS$??? ton Columns(1).Select!!!!!???
    c'est à dire?
    Columns(1).Select est une valeur ou une action?

    si tu veux simplement Select TacelluleSelectionnéeDeLaColonne"A" From....
    tu vois?

  11. #11
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    @ Mercatog,

    Je pensais à un problème de conversion.

    le select cdate(toto) converti un champ en date.
    Je n'y crois pas vraiment

    Le problème vient peut-être du pilote odbc ???
    Il me semble avoir eu le même problème de format entre une base postgres et access

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    à moi je crois que est l'action de sélectionner la première colonne
    alors que dans la requête, j'attends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Open "SELECT '" & LaValeurCherchée & "' FROM [Retour UPS$]"

  13. #13
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonsoir à tous (et aussi à toutes peut être)

    "SELECT * FROM [Retour UPS$]" me ressort bien toutes les valeurs du tableau avec le bon nombre d'enregistrements ainsi que les bonnes valeurs.

    Le problème est que je cherche à récupérer uniquement les valeurs dans la colonne choisi.

    Prenons le SQL simple: "SELECT [nom de la colone] FROM [la table]" pour n'avoir que les données de la colonne (plus la condition WHERE pour affiner la recherche).

    J'ai tenté cette requête pour tester: ""SELECT * FROM [Retour UPS$] WHERE '" & Columns(1).Select & "' = true" résultat il me prend tout, alors que si je mets false à la place, il me spécifie que l'enregistrement est BOF ou EOF, donc bien vide.

    Ma conclusion est que cette méthode teste si les cellules de la colonne sont vide ou non.

    Pour ce qui est de convertir les données, cela ne change rien, ça reste toujours sur "vrai" (j'avais déjà tenté)

    Bienvenu à Saint Mystère

  14. #14
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Open "SELECT '" & Columns(1).Select & "' FROM [Retour UPS$]", cn, adOpenDynamic, adLockOptimistic
    Que veux tu Select From Retour UPS$??? ton Columns(1).Select!!!!!???
    c'est à dire?
    Columns(1).Select est une valeur ou une action?

    si tu veux simplement Select TacelluleSelectionnéeDeLaColonne"A" From....
    tu vois?
    pour répondre à ta question, je veux toutes les valeurs de la colonne choisi (après je verrai pour la condition).

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Select attend un champ ou une liste de champs.
    n'est pas une instruction de champ valide...
    Si tu veux extraire dans un recordset UNE SEULE colonne de ta source de données, tu dois la nommer.

    Par exemple, si tu veux récupérer toutes les valeurs du champ Nom d'une table Contacts, tu auras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom from contacts
    (Laissons la clause where de côté pour le moment)

    Si tu veux choisir la colonne, tu dois recomposer une chaine de caractères pour constituer ta requête sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim sql as string
    dim NomChamp as string
     
    nomchamp = "Nom"
    sql= "select " & nomchamp & " from contacts"
    rs.open sql
    Essaie de nous donner le contexte dans lequel tu travailles, car je pense que ton problème est hyper simple, mais tu le rends très compliqué à cause d'informations parcellaires et confuses

  16. #16
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    STOPPPPPPPPP!!

    Arrêtez de chercher, j'ai trouvé.

    Comme précisé dans un des posts précédents, j'ai les premières cellules fusionnées pour l'intitulé de la feuille et c'est ca qui emmerde le monde.

    Je l'ai supprimé et j'ai fait de la manière suivant "SELECT [intitulé de colonne] FROM [nom de la feuille]" et ca passe impec

    Merci pour l'aide à tous les participants ce fut court mais bon

    A++

    NB: le Columns(1).select ne fonctionne pas, je vois pas pourquoi j'ai vu ça dans le post d'un autre site...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/05/2013, 11h05
  2. trier des données excel grâce à VBA
    Par fred2949 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/01/2008, 19h27
  3. Supprimer des données Excel sous VBA Access
    Par Sam 069 dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/10/2007, 09h55
  4. import de donnée excel sous word
    Par CoOki_ dans le forum Word
    Réponses: 5
    Dernier message: 17/08/2007, 18h16
  5. Extration de données Excel via VBA
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/04/2007, 09h08

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