Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 15h37   #1
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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:

Citation:
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 :
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 :
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.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 15h51   #2
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Et de cette façon ?
Code :
1
2
3
4
 
        strSql = "SELECT course, section, vitesse_moy, ecart_type " & _
                 "FROM " & strStatTbl & _
                 " WHERE section='" & CStr(arrSections(i)) & "';"
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 16h10   #3
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Ç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.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 20h23   #4
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Re,

Il y a quelque chose que je ne comprend pas, Tu me dis :
Citation:
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 ?
Citation:
CStr(arrSections(i))
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 20h35   #5
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Quelle est la valeur de la variable StrSQL lors du Refresh ?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 11h29   #6
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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 :
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...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 17h01   #7
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
oups, en effet je percute sur le message d'erreur
Citation:
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 17h27   #8
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 16h09   #9
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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 :
1
2
3
        strSql = "SELECT course,section,vitesse_moy,ecart_type" & _
                " FROM " & strStatTbl & _
                " WHERE [section]=" & CStr(arrSections(i)) & ";"
Et ça marche!
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h58.


 
 
 
 
Partenaires

Hébergement Web