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

VBA Access Discussion :

[VBA] Syntaxe avec des guillemets


Sujet :

VBA Access

  1. #1
    Membre Expert Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut [VBA] Syntaxe avec des guillemets
    Bonjour,

    Je fais appel à une fonction nommée Combien pour compter le nombre d'enregistrements d'une requête. Cette requête fait appel elle-même à une fonction de regroupement.

    J'ai des soucis pour trouver la syntaxe exacte : bien qu'ayant consulté l'aide en ligne, je finis par ne plus savoir où je vais entre les doubles, voire triples guillemets , les Chr$(34), etc.

    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
    Function CouleurRelance()
        Dim NbEnreg As Long
        Dim sSQL As String
        sSQL = "SELECT tbl_UNITES.CUnite_ID, tbl_UNITES.Unite, tbl_AFFECTATIONS.Affectation, tbl_AGENTS.MAJ, tbl_AGENTS.Sortie, [Nom] & " " & PremMajMotsComp([Prenom]) AS Agent, tbl_GRADES.Grade, tbl_DEMANDES.CDemande_ID, tbl_CATEGORIES.Cat, tbl_CATEGORIES.Duree, tbl_DEMANDES.Formation, tbl_DEMANDES.Relance, DateSerial(Year([Formation]),Month([Formation])+[Duree],Day([Formation])) AS Validite " & _
               "FROM tbl_UNITES INNER JOIN (tbl_GRADES INNER JOIN (tbl_CATEGORIES INNER JOIN ((tbl_AFFECTATIONS INNER JOIN tbl_AGENTS ON tbl_AFFECTATIONS.CAffectation_ID = tbl_AGENTS.CAffectation) INNER JOIN tbl_DEMANDES ON tbl_AGENTS.Matricule_ID = tbl_DEMANDES.Matricule) ON tbl_CATEGORIES.CCategorie_ID = tbl_DEMANDES.CCategorie) ON tbl_GRADES.CGrade_ID = tbl_AGENTS.CGrade) ON tbl_UNITES.CUnite_ID = tbl_AFFECTATIONS.CUnite " & _
               "WHERE (((tbl_AGENTS.MaJ) = DMax("[MAJ]", "tbl_AGENTS")) And ((tbl_AGENTS.Sortie) > Date) And ((tbl_CATEGORIES.Duree) > 0) And ((tbl_DEMANDES.Formation) Is Not Null) And ((tbl_DEMANDES.Relance) Is Null) And ((DateSerial(Year([Formation]), Month([Formation]) + [Duree], Day([Formation]))) < Date)) " & _
               "ORDER BY tbl_UNITES.Unite;"
     
        NbEnreg = Combien("SELECT Count(*) FROM " & sSQL & ";")
     
        If ECF("frm_A_propos") = True Then
            If NbEnreg > 0 Then
                Forms![frm_A_propos]!recRelance.BackColor = 255
            Else
                Forms![frm_A_propos]!recRelance.BackColor = 32768
            End If
        End If
    End Function
     
    Function Combien(strSQL As String) As Long
        Dim oDb As DAO.Database
        Dim oRst As DAO.Recordset
        Set oDb = CurrentDb
        Set oRst = oDb.OpenRecordset(strSQL)
        Combien = oRst.Fields(0).Value
        oRst.Close
        oDb.Close
        Set oRst = Nothing
        Set oDb = Nothing
    End Function
    Je pense que l'erreur est à deux endroits. Tout d'abord ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Nom] & " " & PremMajMotsComp([Prenom])
    puis là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DMax("[MAJ]", "tbl_AGENTS")
    Quelqu'un pour me dépanner ?

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    je n'ai pas tout vérifier mais effectivement il y a au moins ces deux là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DMax(""[MAJ]"", ""tbl_AGENTS"")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Nom] & "" "" & PremMajMotsComp([Prenom])
    comme tu l'avais vu
    mais je te conseil de faire un msgbox ou debug.print de l'expression sSQL avant ainsi tu verras effectivement mieux les erreurs

    ps: ap verif pas vu d'autre...

  3. #3
    Membre Expert Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut
    Merci de ta réponse Vodiem,

    Effectivement les doubles guillemets tels que tu me les proposes semblent convenir.

    J'ai par contre une erreur d'exécution '3061'
    Trop peu de paramètres. 1 attendu.

    Je pense que l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbEnreg = Combien("SELECT Count(*) FROM " & sSQL & ";")
    est mal interprétée... Peut être l'imbrication de 2 "SELECT" ???

    As-tu une explication ?

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    effectivement dans 'Combien' tu as l'air bien sur de toi.
    si l'imbrication des selects posais pb tu aurais une erreur sur l'exécution du OpenRecordset(strSQL)
    la requete dois fournir au minimum un enregistrement: es ce le cas?
    je te conseil de faire un debug.print sSQL
    mettre un point d'arret
    recopier la valeur du sSQL dans une requete et voir ce que ca donne comme enregistrement.

    remarque que c'est pas impossible comme tu dis que cela vienne de cette synthaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbEnreg = Combien("SELECT Count(*) FROM " & sSQL & ";")
    fait donc plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    critere="SELECT Count(*) FROM " & sSQL & ";"
    NbEnreg = Combien(critere)

  5. #5
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    Bonsoir Gabout,
    Tu utilises une instruction SQL comme source de données utilisée dans ta requête SQL: c'est une sous-requête. Dans le cas où une sous-requête est utilisée dans la source d'une autre requête il faut impérativement (du moins je crois) respecter la syntaxe suivante:
    Code syntaxe : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Liste des champ FROM [SELECT Liste des champs FROM Table WHERE Critère ORDER BY Tri]. AS NomAlias;
    La sous-requête est placée entre crochets suivis d'un point puis un nom d'alias. Et il ne faut pas placer un point virgule dans la sous-requête car le point virgule signale la fin de l'instruction!
    si tu as des problèmes à utiliser les double quotes, pourquoi ne pas utiliser un simple quote (même si cela fait un peu américain)?
    Donc, en tenant compte de ces informations, le code dans ton premier post se transforme en ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function CouleurRelance()
        Dim NbEnreg As Long
        Dim sSQL As String
        sSQL = "SELECT tbl_UNITES.CUnite_ID, tbl_UNITES.Unite, tbl_AFFECTATIONS.Affectation, tbl_AGENTS.MAJ, tbl_AGENTS.Sortie, [Nom] & ' ' & PremMajMotsComp([Prenom]) AS Agent, tbl_GRADES.Grade, tbl_DEMANDES.CDemande_ID, tbl_CATEGORIES.Cat, tbl_CATEGORIES.Duree, tbl_DEMANDES.Formation, tbl_DEMANDES.Relance, DateSerial(Year([Formation]),Month([Formation])+[Duree],Day([Formation])) AS Validite " & _
               "FROM tbl_UNITES INNER JOIN (tbl_GRADES INNER JOIN (tbl_CATEGORIES INNER JOIN ((tbl_AFFECTATIONS INNER JOIN tbl_AGENTS ON tbl_AFFECTATIONS.CAffectation_ID = tbl_AGENTS.CAffectation) INNER JOIN tbl_DEMANDES ON tbl_AGENTS.Matricule_ID = tbl_DEMANDES.Matricule) ON tbl_CATEGORIES.CCategorie_ID = tbl_DEMANDES.CCategorie) ON tbl_GRADES.CGrade_ID = tbl_AGENTS.CGrade) ON tbl_UNITES.CUnite_ID = tbl_AFFECTATIONS.CUnite " & _
               "WHERE (((tbl_AGENTS.MaJ) = DMax('[MAJ]', 'tbl_AGENTS')) And ((tbl_AGENTS.Sortie) > Date) And ((tbl_CATEGORIES.Duree) > 0) And ((tbl_DEMANDES.Formation) Is Not Null) And ((tbl_DEMANDES.Relance) Is Null) And ((DateSerial(Year([Formation]), Month([Formation]) + [Duree], Day([Formation]))) < Date)) " & _
               "ORDER BY tbl_UNITES.Unite"
     
        NbEnreg = Combien("SELECT Count(*) FROM [" & sSQL & "]. AS SousReq;")
    Bon courage et @+

  6. #6
    Membre Expert Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut
    Merci de ta réponse Mahefasoa,

    Mais j'ai une erreur d'exécution '3126'.
    Mise entre crochets non valide du nom [SELECT tbl_UNITES.CUnite_ID, tbl_UNITES.Unite, tbl_AFFECTATIONS.Affectation, tbl_AGENTS.MAJ, tbl_AGENTS.Sortie, [Nom'.


  7. #7
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    Salut,
    Dans la sous-requête il ne devrait pas y avoir de crochet!!!
    Il faut rechercher un autre moyen d'utiliser les fonctions de regroupement de domaine dans ta sous-requête, en les affectant à une variable par exemple!
    Mais la syntaxe d'utilisation de sous-requête commen source de requête est à respecter!

    Bon courage et @+

  8. #8
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    J'ai enlevé tous les crochets. Il serait préférable que tu mentionnes devant certain champ le nom de la table contenant ce champ: table.champ
    J'ai ajouté une variable supplémentaire pour recevoir la valeur renvoyée par la fonction DMax
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim sSQL As String, xMax As Long, NbEnreg As Long
     
    xMax = DMax("[MAJ]", "tbl_AGENTS")
     
    sSQL = "SELECT tbl_UNITES.CUnite_ID, tbl_UNITES.Unite, tbl_AFFECTATIONS.Affectation, tbl_AGENTS.MAJ, tbl_AGENTS.Sortie, Nom & ' ' & PremMajMotsComp(Prenom) AS Agent, tbl_GRADES.Grade, tbl_DEMANDES.CDemande_ID, tbl_CATEGORIES.Cat, tbl_CATEGORIES.Duree, tbl_DEMANDES.Formation, tbl_DEMANDES.Relance, DateSerial(Year(Formation),Month(Formation)+Duree,Day(Formation)) AS Validite " & _
    "FROM tbl_UNITES INNER JOIN (tbl_GRADES INNER JOIN (tbl_CATEGORIES INNER JOIN ((tbl_AFFECTATIONS INNER JOIN tbl_AGENTS ON tbl_AFFECTATIONS.CAffectation_ID = tbl_AGENTS.CAffectation) INNER JOIN tbl_DEMANDES ON tbl_AGENTS.Matricule_ID = tbl_DEMANDES.Matricule) ON tbl_CATEGORIES.CCategorie_ID = tbl_DEMANDES.CCategorie) ON tbl_GRADES.CGrade_ID = tbl_AGENTS.CGrade) ON tbl_UNITES.CUnite_ID = tbl_AFFECTATIONS.CUnite " & _
    "WHERE (((tbl_AGENTS.MaJ) = " & xMax & ") And ((tbl_AGENTS.Sortie) > Date) And ((tbl_CATEGORIES.Duree) > 0) And ((tbl_DEMANDES.Formation) Is Not Null) And ((tbl_DEMANDES.Relance) Is Null) And ((DateSerial(Year(Formation), Month(Formation) + Duree, Day(Formation))) < Date)) " & _
    "ORDER BY tbl_UNITES.Unite"
     
    NbEnreg = Combien("SELECT Count(*) FROM [" & sSQL & "]. AS SousReq;")
     
    ...
    Bon courage et @+

  9. #9
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    Re,
    Cette idée me titille depuis le début alors je te la propose quand même:
    pourquoi ne pas créer et enregistrer ta requête (celle qui est assez complexe) dans l'interface d'Access. Tu la nommes SousReq par exemple. Ensuite, tu l'appelles dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NbEnreg = Combien("SELECT Count(*) FROM SousReq;")
    Dans ce cas, SousReq est une requête qui existe en dur.

    Bon courage et @+

  10. #10
    Membre émérite Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 126
    Par défaut
    Je remplace les guillemets par des chr(34) dans mes requetes SQL

  11. #11
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    Mahefasoa> tu as raison il est préférable de couper les requetes, diviser pour régner comme on dit.

    moi je fais mes requetes ainsi et ensuite quand je suis certain qu'il fonctionne correctement alors je les imbriques et si tout marche bien je l'intègre dans un code en corrigeant les guillemets.

    c'est que c'est plus 'propre' de ne pas avoir 36 requetes surtout qd elles dépendent les unes des autres et en plus: qd il y en a beaucoup et après qq semaine d'abandon, on ne sait même plus où elles sont utilisées et après modif lesquelles sont encore utiles...
    autant dire que j'ai pas de requete stokée ou peu.

    bonne continuation

  12. #12
    Membre Expert Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut
    Bonjour et merci de vos réponses attentionnées,

    Mahefasoa > D'enregistrer la sous-requête en "dur"... c'est ce que j'avais fait au début ! C'est en essayant d'imbriquer la sous-requête dans la requête de comptage qui plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbEnreg = Combien("SELECT Count(*) FROM qry_rpt_Relance;")
    vodiem > J'adopte le même principe que toi... le moins de requête possible

    moi je fais mes requetes ainsi et ensuite quand je suis certain qu'il fonctionne correctement alors je les imbriques et si tout marche bien je l'intègre dans un code en corrigeant les guillemets.

    c'est que c'est plus 'propre' de ne pas avoir 36 requetes surtout qd elles dépendent les unes des autres et en plus: qd il y en a beaucoup et après qq semaine d'abandon, on ne sait même plus où elles sont utilisées et après modif lesquelles sont encore utiles...
    autant dire que j'ai pas de requete stokée ou peu.
    Bien... je vais continuer à plancher ce soir sur vos idées, bye

  13. #13
    Membre Expert
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Par défaut
    Salut,
    Ce que je voulais souligner c'est l'utilisation de la sous-requête comme source d'une autre requête: à considérer la syntaxe que j'ai proposée. L'instruction source mise entre crochets et dans les crochets pas d'autres crochet! Le tout suivi d'un point et un nom d'alias.

    Le reste Gabout, tu l'adaptes comme cela te convient.

    Bon courage et @+

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

Discussions similaires

  1. [CSV] importation CSV avec des guillemets
    Par trash_board dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2006, 14h08
  2. Problème de syntaxe avec des nombres
    Par baleiney dans le forum Langage
    Réponses: 7
    Dernier message: 09/07/2006, 10h48
  3. [VBA-E]Inserer des guillemets dans un string
    Par repié dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/02/2006, 10h47
  4. Réponses: 9
    Dernier message: 28/10/2005, 11h43
  5. [C#] Prob IndexOf sous Pocket Pc avec des guillemets
    Par freddyboy dans le forum Windows Mobile
    Réponses: 7
    Dernier message: 10/06/2004, 09h57

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