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 impossible avec objet QueryTable [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut Requête SQL impossible avec objet QueryTable
    Bonjour,

    J'ai besoin d'utiliser un objet de type QueryTable pour récupérer des données d'un fichier Access.
    Le problème survient lorsque je veux exécuter une requête SQL avec une clause "WHERE". J'ai alors une belle erreur 1004:

    Error 1004 La requête ne s'est pas exécutée ou la table de la base de données n'a pas pu être ouverte.
    Le code utilisé est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            'Extraction des stats
            strConnection = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbStatPath & ";Persist Security Info=False"
            Set rngDestination = myStatSheet.Range("A1")
            strSql = "SELECT course,section,vitesse_moy,ecart_type" & _
                    " FROM " & strStatTbl & _
                    " WHERE section=" & CStr(arrSections(i)) & ";"
     
            With myStatSheet.QueryTables.Add(strConnection, rngDestination, strSql)
                .AdjustColumnWidth = True
                .BackgroundQuery = True
                .Refresh
            End With
     
    'dbStatPath et strStatTbl sont des 'string' contenant respectivement le chemin absolu de la bdd Access et le nom de la table sur laquelle récupérer les données, arrSections() un tableau de 'Long'
    Là où ça devient troublant c'est que si j'exécute la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSql = "SELECT * & _
            " FROM " & strStatTbl & ";"
    ...ça marche!

    J'ai essayé de le faire directement sous Excel et même topo. Si j'utilise '*' pour désigner les colonnes à récupérer ET que je ne précise pas de clause 'WHERE' alors ça fonctionne. Mais si j'essaie de faire exécuter ma requête "complète" alors j'ai le même message d'erreur.

    Je précise que la même requête exécutée dans la base Access fonctionne parfaitement.

    Il y a là quelque chose qui m'échappe...merci d'avance pour votre aide.

  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
    Bonjour,

    Et de cette façon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            strSql = "SELECT course, section, vitesse_moy, ecart_type " & _
                     "FROM " & strStatTbl & _
                     " WHERE section='" & CStr(arrSections(i)) & "';"
    Hervé.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Ça plante également (d'ailleurs j'avais oublié de le préciser mais c'est sur le .Refresh que cela plante).

    Mais les apostrophes servent normalement à indiquer en SQL que l'on fait référence à une chaine de caractère, non? Or dans mon cas, arrSections(i) renvoie bien un entier et la colonne 'section' de ma table est bien de type entier également.

  4. #4
    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,

    Il y a quelque chose que je ne comprend pas, Tu me dis :
    dans mon cas, arrSections(i) renvoie bien un entier et la colonne 'section' de ma table est bien de type entier également
    La fonction Cstr() renvoie un String, alors pourquoi faire la conversion en String ?
    CStr(arrSections(i))
    Hervé.

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

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Quelle est la valeur de la variable StrSQL lors du Refresh ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Citation Envoyé par Theze Voir le message
    Re,

    La fonction Cstr() renvoie un String, alors pourquoi faire la conversion en String ?

    Hervé.
    Parce que ma requête SQL est une chaîne de caractères. VBA le ferait certainement automatiquement mais ça ne me coûte pas grand chose de le faire explicitement. Ce que je veux surtout dire par rapport à mon type entier c'est qu'en SQL, si le champ 'machin' est de type entier la clause WHERE ressemble à ça:

    Alors que si mon champ 'machin' est de type texte, du coup il faudra écrire:

    C'est pour ça que dans mon cas je ne pense pas qu'il faille mettre des apostrophes. D'ailleurs, comme je le précisais dans mon premier post, si j'exécute la requête telle qu'elle est écrite dans mon code directement dans la bdd (sous Access), elle fonctionne parfaitement!

    Citation Envoyé par jfontaine Voir le message
    Bonjour,

    Quelle est la valeur de la variable StrSQL lors du Refresh ?
    Au premier passage dans la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT course,section,vitesse_moy,ecart_type FROM Stats_c WHERE section=1;
    Désolé pour le flood mais j'ai découvert un nouveau symptôme...comme expliqué, si je fais la manip' à la main sous Excel, j'obtiens la même erreur (même avec d'autres tables de la même bdd) mais avec une autre bdd, les requêtes SQL dans le même genre fonctionnent!

    Il doit donc y avoir un souci avec cette bdd...

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

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    oups, en effet je percute sur le message d'erreur
    Error 1004 La requête ne s'est pas exécutée ou la table de la base de données n'a pas pu être ouverte.
    ta requête n'a rien a voir avec ton problème.
    Est ce que le fichier .mdb s'ouvre avec access

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Citation Envoyé par jfontaine Voir le message
    Est ce que le fichier .mdb s'ouvre avec access
    Oui, pafaitement. Les requêtes s'exécutent sans problème également sous Access.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    J'ai fini par trouver la solution que je me permets de préciser au cas où d'autres rencontreraient un problème similaire...

    Je me suis aperçu que la requête fonctionnait avec une clause WHERE portant sur d'autre champs . J'en suis donc arrivé à la conclusion que c'est le nom du champ ('section') qui doit être ambigüe pour Jet (à moins que la cause soit tout autre mais étant donné l'étendue de mes connaissances en SQL, je serais bien incapable de le dire).

    Pour lever "l'ambigüité", il suffit de mettre le nom du champ entre crochets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            strSql = "SELECT course,section,vitesse_moy,ecart_type" & _
                    " FROM " & strStatTbl & _
                    " WHERE [section]=" & CStr(arrSections(i)) & ";"
    Et ça marche!

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

Discussions similaires

  1. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  2. [Smarty] boucles imbriquées avec requêtes SQL, impossible à comprendre
    Par dexxter dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 18/05/2007, 23h52
  3. Requête SQL - Pb avec la clause GROUP BY
    Par jeromesco dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/07/2006, 09h04
  4. [MySQL] probleme d'une requête SQL crée avec phpmyadmin
    Par ghita269 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/10/2005, 10h15
  5. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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