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 :

Requête SQL via ADODB - Erreur syntaxe [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 73
    Points : 55
    Points
    55
    Par défaut Requête SQL via ADODB - Erreur syntaxe
    Bonjour,

    Je dispose d'une base de donnée SQL hébergée sur un serveur, je souhaiterais via Excel récupérer des données dans une feuille de calcul. Après moult lectures sur le sujet (je suis autodidacte en perpétuelle autoformation) j'ai réussi via Microsoft query a connecter la base et même à enregistrer une requête pour mon extraction (j'ai donc un sql tout prêt).
    Maintenant je souhaite automatiser tout cela via une macro, j'ai donc fait appel à l'enregistreur pour voir comment il procédait. Lors de la manip j'ai bien mes résultats dans la feuille. Mais lorsque je relance la macro il bug !!!

    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 Connexion_Oenodoc()
     
    Dim Client As String, DateDebut As String, DateFin As String
     
    Client = ActiveSheet.Range("B1").Value
    DateDebut = ActiveSheet.Range("B2").Value
    DateFin = ActiveSheet.Range("B3").Value
     
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=Oenodoc;" _
            , Destination:=Range("$A$5")).QueryTable
            .CommandText = Array( _
            "SELECT client_0.CODE_CLIENT, resultat_0.DATE_ANALYSE, echantillon_complet_0.DESIGNATION_ORIGINE, echantillon_complet_0.ORIGINE_LIBRE, dosage_0.DESIGNATION_DOSAGE, resultat_0.RESULTAT_ANALYSE_CORRIGE, " _
            , _
            "unite_mesure_0.DESIGNATION_UNITE" & "FROM oenodoc.client client_0, oenodoc.dosage dosage_0, oenodoc.echantillon echantillon_0, oenodoc.echantillon_complet echantillon_complet_0, oenodoc.methode_analyse m" _
            , _
            "ethode_analyse_0, oenodoc.resultat resultat_0, oenodoc.unite_mesure unite_mesure_0" & "WHERE methode_analyse_0.NUM_ANALYSE = resultat_0.NUM_ANALYSE AND methode_analyse_0.NUM_DOSAGE = dosage_0.NUM_DOSAGE " _
            , _
            "AND echantillon_0.CODE_RECEPTION = echantillon_complet_0.CODE_RECEPTION AND echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION AND client_0.NUM_CLIENT = echantillon_0.NUM_CLIENT AND client_0.NUM" _
            , _
            "_CLIENT = echantillon_complet_0.NUM_CLIENT AND unite_mesure_0.NUM_UNITE = methode_analyse_0.NUM_UNITE AND client_0.CODE_CLIENT = '" & Client & "' AND resultat_0.DATE_ANALYSE > '" & DateDebut & "' And resultat_0.DATE_ANALYSE < '" & DateFin & "' ")
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .ListObject.DisplayName = "Tableau_Suivi_oenodoc"
            .Refresh BackgroundQuery:=False
        End With
     
    End Sub
    Je suis donc parti sur une base de macro pour rédiger celle-ci :

    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
    Sub EnCours_Extract()
     
    'Déclaration variables requête
    Dim Client As String, DateDebut As String, DateFin As String
     
    Client = ActiveSheet.Range("B1").Value
    DateDebut = ActiveSheet.Range("B2").Value
    DateFin = ActiveSheet.Range("B3").Value
     
    'Déclaration de la variable de connexion
    Dim cNx As New ADODB.Connection, oRS As New ADODB.Recordset
    Dim NomDuDSN As String, NomUtilisateur As String, MotDePasse As String
    Dim sSQL As String
    Dim ReturnArray
     
    NomDuDSN = "########"
    NomUtilisateur = "########"
    MotDePasse = "########"
     
    'Définition de la connexion
    cNx.ConnectionString = "DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";"
    cNx.Open
     
    'Requête SQL
    sSQLSting = "SELECT client_0.CODE_CLIENT, resultat_0.DATE_ANALYSE, echantillon_complet_0.DESIGNATION_ORIGINE, echantillon_complet_0.ORIGINE_LIBRE, dosage_0.DESIGNATION_DOSAGE, resultat_0.RESULTAT_ANALYSE_CORRIGE, " & _
                "unite_mesure_0.DESIGNATION_UNITE" & "FROM oenodoc.client client_0, oenodoc.dosage dosage_0, oenodoc.echantillon echantillon_0, oenodoc.echantillon_complet echantillon_complet_0, " & _
                "oenodoc.methode_analyse methode_analyse_0, oenodoc.resultat resultat_0, oenodoc.unite_mesure unite_mesure_0" & "WHERE methode_analyse_0.NUM_ANALYSE = resultat_0.NUM_ANALYSE AND methode_analyse_0.NUM_DOSAGE = dosage_0.NUM_DOSAGE " & _
                "AND echantillon_0.CODE_RECEPTION = echantillon_complet_0.CODE_RECEPTION AND echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION AND client_0.NUM_CLIENT = echantillon_0.NUM_CLIENT AND client_0.NUM " & _
                "_CLIENT = echantillon_complet_0.NUM_CLIENT AND unite_mesure_0.NUM_UNITE = methode_analyse_0.NUM_UNITE AND ((client_0.CODE_CLIENT='& Client &') AND (resultat_0.DATE_ANALYSE>'& DateDebut &' And resultat_0.DATE_ANALYSE<'& DateFin &'))"
     
    oRS.Open sSQLSting, cNx
     
    Sheet2.Range("A1").CopyFromRecordset oRS
     
    oRS.Close
    cNx.Close
    Set oRS = Nothing
    Set cNx = Nothing
     
    End Sub
    Le bug se situe lors de l'exécution de la ligne oRS.Open sSQLString, cNx il semblerait que la synthaxe de ma requête soit défaillante.
    Message d'erreur affiché : Erreur d'exécution '-2147217900 (80040e14)': You have an error in your syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near '_cCLIENT = echantillon_complet_0.NUM_CLIENT AND unite_mesure_0.NUM_UNITE = method' at line 3

    Je patine un peu dans la semoule depuis hier, auriez-vous un avis éclairé pour me faire avancer. Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    dans ta requête, tu ne fais pas le lien entre toutes les tables!
    Code Sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    "WHERE methode_analyse_0.NUM_ANALYSE = resultat_0.NUM_ANALYSE " & _ 
    "AND methode_analyse_0.NUM_DOSAGE = dosage_0.NUM_DOSAGE " & _
    "AND echantillon_0.CODE_RECEPTION = echantillon_complet_0.CODE_RECEPTION " & _
    "AND echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION " & _
    "AND client_0.NUM_CLIENT = echantillon_0.NUM_CLIENT " &  _ 
    "AND client_0.NUM_CLIENT = echantillon_complet_0.NUM_CLIENT " & _ 
    "AND unite_mesure_0.NUM_UNITE = methode_analyse_0.NUM_UNITE " & _
    j'ai due m'arrêter là car je ne pouvais pas établir de relation mais ça te donnera un idée
    Code Sql avec INNER JOIN : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sql = "SELECT client_0.CODE_CLIENT, resultat_0.DATE_ANALYSE, echantillon_complet_0.DESIGNATION_ORIGINE, echantillon_complet_0.ORIGINE_LIBRE, dosage_0.DESIGNATION_DOSAGE, "
    Sql = Sql & "resultat_0.RESULTAT_ANALYSE_CORRIGE,unite_mesure_0.DESIGNATION_UNITE "
    Sql = Sql & "FROM oenodoc.client client_0  "
    Sql = Sql & "INNER JOIN oenodoc.echantillon echantillon_0 ON  client_0.NUM_CLIENT = echantillon_0.NUM_CLIENT "
    Sql = Sql & "INNER JOIN oenodoc.echantillon_complet echantillon_complet_0 ON echantillon_0.CODE_RECEPTION = echantillon_complet_0.CODE_RECEPTION "
    Sql = Sql & "AND  client_0.NUM_CLIENT = echantillon_complet_0.NUM_CLIENT "
    Sql = Sql & "INNER JOIN oenodoc.resultat resultat_0 ON echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION "
    Sql = Sql & "INNER JOIN oenodoc.unite_mesure unite_mesure_0"
    Code close Where : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sql = Sql & "Where client_0.CODE_CLIENT='" & Client & "' "  'Fermer la chaîne de texte pour concaténer une variable VBA ["]
    Sql = Sql & "	AND resultat_0.DATE_ANALYSE>'" & DateDebut & "' " 
    Sql = Sql & "	AND resultat_0.DATE_ANALYSE<'" & DateFin & "';"
    Images attachées Images attachées  
    Dernière modification par Invité ; 01/08/2014 à 12h16.

  3. #3
    Membre du Club
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 73
    Points : 55
    Points
    55
    Par défaut
    Tout d'abord merci rdurupt pour le temps que tu as bien voulu me consacrer.

    J'ai terminé mon code qui fonctionne partiellement puisqu'il ne me renvoie aucun résultats, mais ça progresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sql = "SELECT client_0.CODE_CLIENT, resultat_0.DATE_ANALYSE, echantillon_complet_0.DESIGNATION_ORIGINE, echantillon_complet_0.ORIGINE_LIBRE, dosage_0.DESIGNATION_DOSAGE, resultat_0.RESULTAT_ANALYSE_CORRIGE, unite_mesure_0.DESIGNATION_UNITE "
    Sql = Sql & "FROM oenodoc.client client_0 "
    Sql = Sql & "INNER JOIN oenodoc.echantillon_complet echantillon_complet_0 ON client_0.NUM_CLIENT = echantillon_complet_0.NUM_CLIENT "
    Sql = Sql & "INNER JOIN oenodoc.echantillon echantillon_0 ON echantillon_complet_0.CODE_RECEPTION = echantillon_0.CODE_RECEPTION "
    Sql = Sql & "INNER JOIN oenodoc.resultat resultat_0 ON echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION "
    Sql = Sql & "INNER JOIN oenodoc.methode_analyse methode_analyse_0 ON resultat_0.NUM_ANALYSE = methode_analyse_0.NUM_ANALYSE "
    Sql = Sql & "INNER JOIN oenodoc.dosage dosage_0 ON methode_analyse_0.NUM_DOSAGE = dosage_0.NUM_DOSAGE "
    Sql = Sql & "INNER JOIN oenodoc.unite_mesure unite_mesure_0 ON unite_mesure_0.NUM_UNITE = methode_analyse_0.NUM_UNITE "
    Sql = Sql & "WHERE client_0.CODE_CLIENT='" & Client & "' "
    Sql = Sql & "AND resultat_0.DATE_ANALYSE>='" & DateDebut & "' "
    Sql = Sql & "AND resultat_0.DATE_ANALYSE<='" & DateFin & "';"

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PaulG2B Voir le message
    Tout d'abord merci rdurupt pour le temps que tu as bien voulu me consacrer.

    J'ai terminé mon code qui reste sur une erreur de syntaxe mais je vais trouver la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sql = "SELECT client_0.CODE_CLIENT, resultat_0.DATE_ANALYSE, echantillon_complet_0.DESIGNATION_ORIGINE, echantillon_complet_0.ORIGINE_LIBRE, dosage_0.DESIGNATION_DOSAGE, resultat_0.RESULTAT_ANALYSE_CORRIGE, unite_mesure_0.DESIGNATION_UNITE "
    Sql = Sql & "FROM oenodoc.client client_0 "
    Sql = Sql & "INNER JOIN oenodoc.echantillon_complet echantillon_complet_0 ON client_0.NUM_CLIENT = echantillon_complet_0.NUM_CLIENT "
    Sql = Sql & "INNER JOIN oenodoc.echantillon echantillon_0 ON echantillon_complet_0.CODE_RECEPTION = echantillon_0.CODE_RECEPTION "
    Sql = Sql & "INNER JOIN oenodoc.resultat resultat_0 ON echantillon_0.CODE_RECEPTION = resultat_0.CODE_RECEPTION "
    Sql = Sql & "INNER JOIN oenodoc.methode_analyse methode_analyse_0 ON unite_mesure_0.NUM_UNITE = methode_analyse_0.NUM_UNITE "
    Sql = Sql & "INNER JOIN oenodoc.dosage dosage_0 ON methode_analyse_0.NUM_DOSAGE = dosage_0.NUM_DOSAGE "
    Sql = Sql & "INNER JOIN oenodoc.unite_mesure unite_mesure_0 ON ????????????????"
    Sql = Sql & "WHERE client_0.CODE_CLIENT='" & Client & "' "
    Sql = Sql & "AND resultat_0.DATE_ANALYSE>='" & DateDebut & "' "
    Sql = Sql & "AND resultat_0.DATE_ANALYSE<='" & DateFin & "';"
    On Id=Id???
    tu ne site pas la liaison entre les tables???

  5. #5
    Membre du Club
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 73
    Points : 55
    Points
    55
    Par défaut
    Lol vous ne n'avez pas laissé le temps de poster le code corrigé. J'ai mis à jour mon post précédent.
    Merci.

  6. #6
    Invité
    Invité(e)
    Par défaut
    si tu as accès à l'environnement sql serveur,tu vas tester ta requête dessus.
    dans vba, place un point d'arrêt oRS.Open sSQLSting, cNx touche [F9] du clavier.
    exécute ton code touche [F5].
    ouvre la fenêtre d'exécution raccourci clavie [Ctrl] + [G]
    écrits ?sql et valide par la touche [Enter].
    copy col le résulta dans une nouvel vue d'sql serveur.
    si ta requête te retourne Null supprime la close where et ré-exécute ta requête.
    sil la requête est toujour null c'est qune des table ne contient pas la valeur recherché (il ce peut que tu doives modifier certain Inner Join par del Left Join)
    regarde le format des date dans excel le format doit être le même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sql = Sql & "AND resultat_0.DATE_ANALYSE>='" & format(DateDebut,"yyyy-mm-dd hh:mm:ss") & "' "
    Dernière modification par AlainTech ; 09/08/2014 à 10h14. Motif: Suppression de la citation inutile

  7. #7
    Membre du Club
    Homme Profil pro
    Oenologue
    Inscrit en
    Juin 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Oenologue
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 73
    Points : 55
    Points
    55
    Par défaut
    Il s'agissait bien du format de stockage de la date dans excel.

    Je te remercie rdurupt pour la générosité dont tu fais preuve dans le partage de tes connaissances.

    Je tag Résolu !

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

Discussions similaires

  1. Requête SQL via les composants ADO sur une Table Access 97
    Par Didier100 dans le forum Bases de données
    Réponses: 9
    Dernier message: 21/12/2007, 14h43
  2. [Sybase] Accélérer une requête SQL via ODBC.
    Par phtpht dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 04/01/2007, 15h36
  3. Requête SQL via Visual basic
    Par NoViceDel dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/05/2006, 11h12
  4. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28

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