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 :

Erreur requête SQL en VBA dans Excel : colonne contenant des chiffres et des lettres [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Erreur requête SQL en VBA dans Excel : colonne contenant des chiffres et des lettres
    Bonjour

    j'ai un problème en SQL dans excel

    donc j'ai une feuille excel dans laquelle il y a une colonne ou il y a une majorité de nombre... mais il y a aussi des lettres.

    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
    '----- Connection -----
    With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & unFichier & _
    ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"
    .Open
    End With
     
    '----- Pour les rues entière -----
    texte_SQL = "SELECT * FROM [clients rue entiere$] where [Cat Cptr] <> '2' "
    Set Rst = New ADODB.Recordset
    Rst.ActiveConnection = cn
    Rst.CursorType = adOpenKeyset
    Rst.LockType = adLockOptimistic
     
    Rst.Open texte_SQL
    Dans ma chaîne de connexion j'ai beau préciser "IMEX=1" afin que les données numériques soient importées comme du texte et ainsi pouvoir faire au mieux ma requête SQL comme indiquée au dessus avec dans le where [Cat Cptr] <> '2' et non [Cat Cptr] <> 2 et bien j'ai une erreur comme quoi j'essaye de comparer des chiffres ([Cat Cptr]) à des lettres ('2')...

    est ce que vous savez pourquoi cela n'arrive pas à s'importer en tant que texte ?

    (je précise que j'ai testé en faisant [Cat Cptr] <> 2 mais le problème c'est qu'à ce moment la il ne me prend pas en compte les lignes contenant des lettres... or il me les faut ^^ )

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    bonjour,
    Ca m'arrive trop souvent aussi ce genre de truc.
    Alors ta plusieurs méthodes mais perso la plus élégante:
    faire un Schema.ini dans le même dossier

    Alors regarde un peu sur google ou sur msdn
    genre ici : http://msdn.microsoft.com/en-us/library/bb177651.aspx
    http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx

    Si t'y arrive pas jte filerais une fonction qui génère le Schema.ini automatiquement. Elle est proche de celle ci mais j'intègre un param pour forcer le type de certaines colonnes
    http://support.microsoft.com/kb/155512/fr

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    merci pour ta réponse

    ta solution doit effectivement fonctionner... je pensais qu'il pouvait y avoir plus simple on va dire pour corriger mon problème ^^

    je vais regarder tes liens en attendant

    merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Je crois qu'il y a plus simple.
    En fait tu insères une ligne sous ta ligne d'entête où tu forces ton format.
    Genre dans une colonne où tu as que des LONG (en théorie) ben tu écris "toto".

    Ca marche mais c'est vraiment degeux en terme de prog.
    Je ne te le conseille vraiment pas.

  5. #5
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    puisque tu passes par du SQL, tu peux essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT F1 & "", F2 & "" FROM [...
    Le moteur ADO devrait interpréter les champs comme du texte.
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par cafeine Voir le message
    Hello,

    puisque tu passes par du SQL, tu peux essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT F1 & "", F2 & "" FROM [...
    Le moteur ADO devrait interpréter les champs comme du texte.
    ça aurait été pas mal, mais j'ai un problème : mes feuilles excel ou je fais cette requête ont des colonnes variables... du coup je suis obligé de faire un "select * "

  7. #7
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Perso, j'avais le même besoin, je fais donc une première passe uniquement pour récupérer le nom des champs et écrire la requête SQL qui va réellement me servir.
    exemple schématique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sSql = "SELECT"
    For i =0 to rs.Fields.count -1
      sSql = sSql & " [" rs.fields(i).name & "] & """","
    next i
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    désolé pour le double poste donc


    alors j'ai fait ce que tu m'as proposé mais j'ai toujours un problème :

    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
    Set Rst = Nothing
     
                      'Je fais ma première passe :
                      texte_SQL = "SELECT * FROM [Feuille$]"
                      Set Rst = New ADODB.Recordset
                      Rst.ActiveConnection = cn
                      Rst.CursorType = adOpenKeyset
                      Rst.LockType = adLockOptimistic
     
                      Rst.Open texte_SQL
     
                      If Rst.RecordCount > 0 Then
     
                          'Je construit ma chaine de caractères                                
                          sSql = "SELECT"
                          For i = 0 To Rst.Fields.Count - 1
                              sSql = sSql & " [" & Rst.Fields(i).Name & "] & """","
                          Next i
     
                          Set Rst = Nothing
     
                           ' where [Cat Cptr] <> '2'
                          sSql = Left(sSql, Len(sSql) - 1) & " FROM [Feuille$]  "
     
                          Set Rst = New ADODB.Recordset
                          Rst.ActiveConnection = cn
                          Rst.CursorType = adOpenKeyset
                          Rst.LockType = adLockOptimistic
     
                          Rst.Open sSql
     
                          'Les noms sont désormais du genre "Expr1042", "Expr1043", "Expr1044", etc...
                          For i = 0 To Rst.Fields.Count - 1
                                  Cells(1, i + 1) = Rst.Fields(i).Name
                          Next i
                          Range("A1").EntireRow.AutoFilter
     
                          'Ecrit le résultat de la requête dans la cellule à la suite des autres
                          Range("A65536").End(xlUp).Select
                          ActiveCell.Offset(1, 0).Select
                          Range(ActiveCell.Address).CopyFromRecordset Rst
    pour l'instant je fais juste un select et tout est ramené comme du texte donc à part le noms des colonnes qui changent ça marche...

    mais bien sûr si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                          'Je construit ma chaine de caractères                                
                          sSql = "SELECT"
                          For i = 0 To Rst.Fields.Count - 1
                              sSql = sSql & " [" & Rst.Fields(i).Name & "] & """","
                          Next i
     
                          Set Rst = Nothing
     
                          sSql = Left(sSql, Len(sSql) - 1) & " FROM [Feuille$]  where [Cat Cptr] <> '2' "
    il me dit encore incompatibilité de type

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Pourquoi tu veux pas faire ce que je t'ai dis!!!
    Ca marche!

    La méthode de cafeine est bien pour les entête de colonnes variables mais pas pour le contenu variables des colonnes.
    Deplus, le souci de ADODB est que tu peux faire que des "tables liées" cad tu ne peux pas imposer le format.

    Effectivement grace au code de cafeine
    Citation Envoyé par Cafeine
    SELECT F1 & "", F2 & "" FROM [...
    tu peux uniquement forcer en format String mais pas en un autre.

    Avec DAO tu peux créer une table en la "designant" avec les types de données précis sur chaque colonne (string,long,.....) et après importer les données dedans.
    Avec DAO tu peux également faire des requetes SQL DELETE et UPDATE

    Genre tu forces le format "long" pour une colonne.
    Si tu as des "String" il te les mettra en blanc.
    Il suffit de faire une requete UPDATE pour convertir les champs blanc en 0.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par -={-_-}=- Voir le message
    [...]

    Effectivement grace au code de cafeine

    tu peux uniquement forcer en format String mais pas en un autre.
    Ca me va ^^

    Citation Envoyé par -={-_-}=- Voir le message
    Avec DAO tu peux créer une table en la "designant" avec les types de données précis sur chaque colonne (string,long,.....) et après importer les données dedans.
    je veux bien que tu me passes ta fonction qui génère le shema.ini ou que tu m'explique plus comment ça marche (ou un exemple ?), parce que je t'avouerai que j'ai pas tout compris (j'en ai jamais fait) du coup j'étais sous motivé à me lancer dedans hier

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Sergeith Voir le message
    je veux bien que tu me passes ta fonction qui génère le shema.ini ou que tu m'explique plus comment ça marche (ou un exemple ?), parce que je t'avouerai que j'ai pas tout compris (j'en ai jamais fait) du coup j'étais sous motivé à me lancer dedans hier
    O ***** je suis trop ***

    Bon tout d'aborsd je souhaitais m'excuser : je raconte vraiment n'importe quoi.
    Le Schema ini ne sert uniquement à importer les fichiers TXT or tu as un XLS.

    Je crois que je devrais reprendre des vacances :p
    Mais quand meme on va y arriver grace à DAO

    Bon on y va
    Pour info je ne te met pas tt le code mais uniquement ce qui va te servir (en gros je fais des tests d'existance, je les ai enlever pour que la macro tourne)

    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
    42
    43
    44
    45
    46
    47
    Public oDAO As DAO.DBEngine     'Object DAO permettant de piloter Access
    Public Base As DAO.Database     'Base de données Access ou l'on stocker les données et faire les retraitements
    Sub DoTable()
        Dim XLTable As DAO.TableDef
        Dim oIdx As DAO.TableDef
        Dim strSQL As String
        Dim sql As DAO.Recordset
        Dim Dico As Scripting.Dictionary
     
        'Création de la base
        Set oDAO = New DAO.DBEngine
        Set Base = oDAO.CreateDatabase("C:\Base.mdb", ";LANGID=0x0409;CP=1252;COUNTRY=0", 64)
     
     
        'Ajout de la table "clients rue entiere" dans la base
     
        'Création de la table liée et de la table Access
        Set XLTable = Base.CreateTableDef("Temp")
        XLTable.Connect = "Excel 8.0;DATABASE=" & UnFichier
        XLTable.SourceTableName = "clients rue entiere$"
        Base.TableDefs.Append XLTable
        Set oIdx = Base.CreateTableDef("clients rue entiere")
     
     
        'Copie des titres de la table liée dans la table Access
        With oIdx
            For i = 0 To XLTable.Fields.Count - 1
                If XLTable.Fields(i).Name = "Cat Cptr" Then
                    .Fields.Append .CreateField(XLTable.Fields(i).Name, dbtext, 255)
                Else
                    If XLTable.Fields(i).Type = dbtext Then
                        .Fields.Append .CreateField(XLTable.Fields(i).Name, dbtext, 255)
                    Else
                        .Fields.Append .CreateField(XLTable.Fields(i).Name, XLTable.Fields(i).Type)
                    End If
                End If
            Next i
        End With
     
        'Ajout de la table à la base
        Base.TableDefs.Append oIdx
        'Copie des données
        strSQL = "Insert into [clients rue entiere] Select * FROM Temp WHERE NOT [Cat Cptr] LIKE '2' "
        Base.Execute strSQL
        'Suppression de la table liée
        Base.TableDefs.Delete "Temp"
        Base.Close
    Et apres il suffit de faire un recordset sur cette base.

    ALors soit tu fais ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NOT [Cat Cptr] LIKE '2'
    pour la base ou après dans ton recordset..
    C'est toi qui voit.

    Je souhaites vraiment m'excuser pour toutes les conneries que j'ai pu raconter sur cette discussion.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    y a pas de mal

    en tout cas merci, je me suis servi de ton code et ça marche très bien !

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

Discussions similaires

  1. [AC-2003] Plusieures requêtes SQL en vba dans la même macro?
    Par PAUL87 dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/10/2013, 16h43
  2. Requête sql multi-source avec jointure en pur VBA dans excel
    Par guidav dans le forum Général VBA
    Réponses: 1
    Dernier message: 21/09/2013, 20h33
  3. Erreur Requête sql code vba
    Par majudis dans le forum VBA Access
    Réponses: 4
    Dernier message: 24/02/2011, 11h23
  4. Erreur requête SQL en VBA dans Excel
    Par Sergeith dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/06/2009, 15h06

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