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 :

Mettre des variables dans une requête SQL


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Mettre des variables dans une requête SQL
    Bonjour,

    Je viens de revenir , je n'utilise que peu les forums mais la je pense revenir , car je débute un gros projet et j'ai besoin d'aide sur des points un peu pointu en VBA et la gestion dao.

    Je suis sur un projet ou j'aimerais questionné une base de donnée que j'ai créé , seulement avec mon code je n'arrive pas a inserer une variable
    je m'explique dans ma requete ma fois tres simple pour l'exemple , "SELECT name,PrixAction FROM Companies WHERE PrixAction = 30;" on a cette requete entre guillemet ce qui me pose un probleme car quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT name,PrixAction FROM Companies WHERE PrixAction =" & valeur & ";"
    avec valeur une variable correspondant a une valeur que j'aurais rentré dans mon userform par exemple , ca marche pas . donc je demande votre aide
    Je vous remercie d'avance et je pense que vous allez me revoir dans pas longtemps .


    Cordialement

    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
    'recuperer une requete sql
    Sub CopyFromRecordset_DAO()
         Dim Db1 As Database
         Dim Rs1 As Recordset
         Dim requete As String
         ' Ouverture de la base de données
         Set Db1 = DBEngine.OpenDatabase(ThisWorkbook.Path & "\DBShare")
         ' Un objet Recordset représente les enregistrements d'une table
         'requette a ecrire :
         requete = "SELECT name,PrixAction FROM Companies WHERE PrixAction = 30;" ' mettre une guillemet pour le parametre
         Set Rs1 = Db1.OpenRecordset(requete, Type:=dbOpenSnapshot) 'name:="R6"
         ' Effacement des données existantes dans la WorkSheet (sauf les titres)
         ' et copie des enregistrementsSELECT name, Symbol FROM Companies;
         With Worksheets("Feuil1").Range("B1")
              'With Selection.CurrentRegion
                   'Intersect(.Cells, .Offset(1)).Select
     
              'End With
              .ClearContents
              .CopyFromRecordset Rs1
         End With
         'Fermeture de la Base de données
         Db1.Close
    End Sub
    Allez le RC LEns

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Je ne vois pas d'erreur.

    Que contient "valeur" ? Comment est elle déclarée?

    As tu testé avec valeur = 30 pour être sur que ta base contienne des données (puisque tu dis que ça fonctionne avec la ligne contenant 30).

    Si tu places un point d'arrêt et que tu espionne la string contenu dans la variable requete, est-ce que le texte te semble exacte ?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une requête est une chaîne de caractères. Est-ce que ta variable nommée Valeur est une variable de type String ?
    Pour ma part dans des cas semblables, j'utilise pour tout les éléments qui sont variables des balises comme par exemple <Adresse> et j'utilise la fonction Replace pour remplacer les balises par les données variables
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut merci les mec
    Je vais tester et voir avec le debugger , j'avoue que j'avais un peu la fleme , mais je vois que vous avez un sacré niveau , par contre pour les balises j'ai pas trop compris , mais je vais chercher je vous tien au courant en tout cas c'est vraiment simpa d'avoir répondu , et des fois avec un peu de repos on trouve plus facilement donc comme c'est un string normalement je peux faire comme dans un range ou on colle les variables a des chaines de caracteres par un & genre "blablabla" & i ";" le point virgule je le met bien entre guillemet a la fin car il est indispensable a ma requete .

    En tout cas merci je n'oublierais pas de valider , par contre j'ai une deuxieme question , il est possible de remplire une base de donnée et plus precisement une colone d'une table a partir des données d'une colonne excel?
    ca pourrais m'interesser pour rentrer mes données.

    en vba ou pas dailleur car si il ya un moyen interessant et assez simple je suis preneur. ( je recupere les données de internet sur excel et ca je sais tres bien le faire , mais j'avoue que le lien vba access , je débute donc je suis pas a l'aise dessus )
    Allez le RC LEns

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    par contre pour les balises j'ai pas trop compris
    Un petit exemple sur le pouce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Dim req As String, Text As String
     req = "Mon site préféré est <LeSite>"
     Text = "Développez.com"
     req = Replace(req, "<LeSite>", Text)
     MsgBox req
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Eh un petit message a philippe mais pas sur le pouce :p
    Merci bcp pour ton message j'ai appris un truc , je met résolu j'ai reussi ca marche j'avais juste mis une variable dans un mauvais type merci le debugger et l'espion :p surtt
    En tout cas j'espere que ca pourra aider d'autre personne , mon code et ton exemple philippe
    Merci et bonne nuit et surement à trés vite :p
    Allez le RC LEns

  7. #7
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut tjs un probleme aparement
    voici ce que j'ecris et j'ai un msg d'erreur encore sur la ligne qui suis la requete sauf que je sais bien que ca viens de la requete , qui fonctionne tres biens sur access , mais le coup de la variable ... pose probleme.
    J'ai simplifié mon prog , car le i est issu de l'userforme et est saisie par l'user. La on imagine un i en string , je ne vois pas ou est le pb , merci a vous et votre level
    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
    'recuperer une requete sql
    Sub CopyFromRecordset_DAO2()
         Dim Db1 As Database
         Dim Rs1 As Recordset
         Dim requete As String
         Dim i As String
         i = "Action EDF"
         ' Ouverture de la base de données
         Set Db1 = DBEngine.OpenDatabase(ThisWorkbook.Path & "\FinancialDataBase")
         ' Un objet Recordset représente les enregistrements d'une table
         'requette a ecrire :
         '_________________________Requete SQL_________________________________________
         requete = "SELECT Valeur_Max, Valeur_Fermeture " _
    & "FROM Cours, DateCours,SousJacent " _
    & "WHERE Cours.RefC = DateCours.RefC " _
    & "AND SousJacent.RefSJ = DateCours.RefSJ " _
    & "AND DateCours between #01/12/2015# AND #01/16/2015# " _
    & "AND NomSJ = " & i & "; " 
    '_____________________________________________________________________________________
         Set Rs1 = Db1.OpenRecordset(requete, Type:=dbOpenSnapshot) 
         ' Effacement des données existantes dans la WorkSheet (sauf les titres)
         ' et copie des enregistrements
         With Worksheets("Feuil1").Range("B1")
              'With Selection.CurrentRegion
                   'Intersect(.Cells, .Offset(1)).Select
     
              'End With
              .ClearContents
              .CopyFromRecordset Rs1
         End With
         'Fermeture de la Base de données
         Db1.Close
    End Sub
    Allez le RC LEns

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si nous plaçons une requête SQL simple dans une variable de type String comme dans la ligne ci-dessous, nous allons provoquer une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Req = "SELECT EMPLOYE.NOM, EMPLOYE.PRENOM FROM EMPLOYE WHERE (((EMPLOYE.PRENOM)="Roger"));"
    En effet, la constante "Roger" est une chaîne mise entre guillemets et donc ceux-ci doivent être doublés comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Req = "SELECT EMPLOYE.NOM, EMPLOYE.PRENOM FROM EMPLOYE WHERE (((EMPLOYE.PRENOM)=""Roger""));"
    Si nous plaçons la constante "Roger" dans une variable nommée Var, il est impossible de doubler les guillemets comme Var = ""Roger"".
    Il faut donc utiliser le code AscII des guillemets qui a comme valeur 34
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test()
     Dim Req As String, Var As String
     Var = Chr(34) & "Roger" & Chr(34)
     Req = "SELECT EMPLOYE.NOM, EMPLOYE.PRENOM FROM EMPLOYE WHERE (((EMPLOYE.PRENOM)=<Prenom>));"
     Req = Replace(Req, "<Prenom>", Var)
     MsgBox Req
    End Sub
    Tu écris
    voici ce que j'ecris et j'ai un msg d'erreur encore sur la ligne qui suis la requete sauf que je sais bien que ca viens de la requete , qui fonctionne tres biens sur access , mais le coup de la variable ... pose probleme.
    Cela signifie donc que l'erreur se situe sur la ligne 20 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Rs1 = Db1.OpenRecordset(requete, Type:=dbOpenSnapshot)
    Ne connaissant pas la syntaxe DAO par coeur, es-tu certain de sa syntaxe ?
    Mais tu ne donnes pas le n° et le message d'erreur que tu reçois
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Merci
    Le message d'erreur est trop peu de parametres , 1 attendu , ou trop peu de parametre 2 attendu , quand je fonctionne sans variable je n'ai pas cette erreur .

    De plus l'istoire de replace (requete, "<nom>",i) par exeple je dois mettre les balises <> ?

    Je ne comprend pas non plus pourquoi tu met des parentheses dans la requete ? quel est l'interet ?

    En tout cas je viens de tester et ca ne marche pas , et il ne me semble pas avoir oublié quelque chose car j'ai appris comme ca dans excel vba 2013 , le livre de eni , meme si j'ai pas encore bien compris tout , car je debute en dao mais , il me semble que la fonction est juste , mon probleme viens de la requete , qui je le redis marche dans ACCESS
    Merci encore
    Allez le RC LEns

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TxtVar ="Roge"
     Req = "SELECT EMPLOYE.NOM, EMPLOYE.PRENOM FROM EMPLOYE WHERE EMPLOYE.PRENOM='" & TxtVar  & "';"

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 110
    Points : 1 632
    Points
    1 632
    Par défaut
    - Pour ton message d'erreur, a mon avis il survient car les chaines de caractère doivent etre mises entre double quotes en SQL. Vu que VBA a les mêmes exigeances, si tu veut faire apparaitre une double quote dans une chaine, tu dois soit la doubler (essaye debug.print "a""b" par exemple), soit concatener avec chr(34). Choisit la solution qui te convient le mieux.

    - Oui tu dois indiquer la balise complète, < et > inclus.

    - Avec un peut de chance, Philippe a recopié la requete issue du requeteur d'Access (qui rajoute plein, plein, plein de parentheses), c'est optionnel.

    @rdurupt: Je ne recommande pas l'utilisation des simple quotes, ce n'est pas standard SQL.

  12. #12
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut Je m'xcuse
    c'est ma fatigue j'avais laissé un guillemet qui trainait,

    donc on peut ou doubler les "" si on a un a mettre un string dans un string ou sinon mettre des ' '
    genre " blablabla = ' a' "
    en fait ca marche aussi avec des & . Donc je met le sujet comme résolu
    Merci en tout cas et j'ai vu que les parentheses n'etaient pas necessaires aparement dans la requete .


    Cordialement
    Allez le RC LEns

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    @deedolith,
    - Pour ton message d'erreur, a mon avis il survient car les chaines de caractère doivent etre mises entre double quotes en SQL. Vu que VBA a les mêmes exigeances, si tu veut faire apparaitre une double quote dans une chaine, tu dois soit la doubler (essaye debug.print "a""b" par exemple), soit concatener avec chr(34). Choisit la solution qui te convient le mieux.
    Il me semble que c'est ce que j'ai écrit dans ma réponse ce matin à 7h58
    Mais on peux également placer la chaîne entre apostrophe comme l'a écrit Robert.

    @tamtam64
    Je ne comprend pas non plus pourquoi tu met des parentheses dans la requete ? quel est l'interet ?
    Oui, ce n'est pas indispensable et effectivement sans intérêt.
    J'ai pris rapidement une requête effectuée par Access pour tenter de t'aider et je ne l'ai pas rectifiée mais je crois que ce n'était pas le sujet de la discussion.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. mettre une variable dans une requête SQL
    Par zaki18mi dans le forum Java ME
    Réponses: 4
    Dernier message: 14/06/2010, 00h40
  2. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  3. Passer une variable dans une requête SQL
    Par Remedy dans le forum C++
    Réponses: 2
    Dernier message: 11/05/2006, 16h48
  4. [CSS] Mettre des variable dans une feuille de style???
    Par Shakta dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/02/2006, 10h39
  5. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02

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