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

IHM Discussion :

Code VBA pour une zone de liste à sélection multiple


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut Code VBA pour une zone de liste à sélection multiple
    Bonjour,

    Dans mon formulaire Access, j’utilise une zone de liste qui affiche les notes des étudiants et que je remplis à partir d’une requête Union, l'exécution de la raquête ressemble à ça :
    --Tous--
    19
    03
    05
    11
    10
    Quand l’utilisateur clique sur Tous, il doit voir dans un nouveau formulaire, les détails tous les étudiants (tous les enregistrements de la table) ;
    Quand il clique sur une note (19 par exemple), il doit voir les détails de tous les étudiants ayant comme note 19 ;
    Je veux que ma zone de liste permette aux utilisateurs de sélectionner plusieurs valeurs. C’est-à-dire utiliser la sélection multiple. Pour ce faire, dans les propriétés de la zone de liste « Sélection multiple » j’ai mis « Etendue ». Mais j’ai vu que cela tout seul ne suffit pas, et que je dois rajouter du code VBA. Donc j’ai rajouté un bouton Valider où j’ai utilisé le code VBA suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub cmd0_Click()
        Dim x As Long
            For x = 0 To Me.lst0.ListCount - 1
                If Me.lst0.Selected(x) = True Then
                    If [lst0].Value = "--All--" Then
                    DoCmd.OpenQuery "AllQuery"
                    Else
                    DoCmd.OpenQuery "CompleteQuery"
                    End If
                End If
                Next x
    End Sub

    Lst0 : le nom de ma zone de liste ;
    AllQuery : La requête que je veux afficher au cas où l’utilisateur clique sur tous;
    CompleteQuery : La requête que je veux afficher au cas où l’utilisateur clique sur une note définie.
    Quand je clique sur Valider, cela m’emmène vers une requête vide. C’est-à-dire on m’affiche aucun enregistrement.
    Je sais que j'ai des erreurs au niveau du code VBA, mais je ne sais pas où exactement. Quelqu'un peut m'aider?

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Pourrais-tu poster le SQL de AllQuery et de CompleteQuery.

    De plus si je suis bien ton code, il devrait ouvrir autant de requêtes que tu as de sélection. C-à-d 3 classes sélectionnées, 3 reqêtes qui s'ouvrent. Est-ce bien ce que tu veux faire ?

    A+

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Pourrais-tu poster le SQL de AllQuery et de CompleteQuery.
    Bonjour,

    Le code SQL de AllQuery est Le code SQL de CompleteQuery est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Student Where ([MyQuery].[MyField]=[Forms]![MyForm]![MyList])

    De plus si je suis bien ton code, il devrait ouvrir autant de requêtes que tu as de sélection. C-à-d 3 classes sélectionnées, 3 reqêtes qui s'ouvrent. Est-ce bien ce que tu veux faire ?

    A+
    Non, réellement, ce n'est pas ça ce que je veux, je veux qu'il m'affiche le résultat des sélections dans une seule requête, c'est à dire si l'utilisateur sélectionne 3 valeurs, on va m'afficher les informations concernant les enregistrements (étudiants) ayant la note qui ressemble aux valeurs sélectionnées, le tout dans la même requête.
    J'espère que j'ai bien expliqué le problème.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Je n'ai pas testé ce code mais cela devrait marcher.

    Il faut changer dynamiquement le SQL de la requête.

    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
    Private Sub cmd0_Click()
        if me.lst0="--All--" then
               DoCmd.OpenQuery "AllQuery"
            else
     
               dim clauseIn as string
     
               Dim x As Long: For x = 0 To Me.lst0.ListCount - 1
                  If Me.lst0.Selected(x) = True Then
     
                      if clauseIn<>"" the
                         clauseIn=clauseIn & ", "
                      end if
     
                      clauseIn=clauseIn & me.lst0.ItemData(i)                
                  End If
     
               Next x
     
               clauseIn=" in(" & clauseIn & ")"
     
               dim db as dao.database:set db=currentdb
               dim q as dao.qerydef:set q=db.querydefs("CompleteQuery")
               q.sql="Select * from Student Where ([MyQuery].[MyField]" & clauseIn & ")"
               set q=nothing
               set db=nothing
     
               DoCmd.OpenQuery "CompleteQuery"
     
        end if
     
    End Sub
    Si c'est un test que tu fais les noms de tes objets sont corrects, si c'est une vraie application je te suggère de mettre des noms plus descriptif (ex Lst0 pourrait être ListeDesClasses).

    A+
    A+

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Bonjour,
    Ect ce que tu peux m'expliquer les lignes du code de 11 à 16?

    Citation Envoyé par marot_r Voir le message

    Si c'est un test que tu fais les noms de tes objets sont corrects, si c'est une vraie application je te suggère de mettre des noms plus descriptif (ex Lst0 pourrait être ListeDesClasses).
    Merci pour ton aide et pour ton conseil, oui je vais essayer de les renommer.

    J'ai essayé ce code, Mais ça n'a pas marché...

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    J'ai essayé ce code, Mais ça n'a pas marché...
    Peux-tu donner plus de détails ?

    As-tu un message d'erreur ?

    Cela ne donne pas le résultat attendu ?

    Cela ne donne pas de résultat du tout ?

    Autre chose ?

    A+

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Oui quand je clique sur le bouton exécutant le code VBA, on m'affiche un message d'erreur:

    Erreur d'exécution '3075'
    Erreur de syntaxe (opérateur absent) dans l'expression <<(student.Note in(--All--))>>.


    Student est le nom de ma table; Note: le nom de mon champ.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Bizare, on dirait que le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if me.lst0="--All--" then
    n'a pas fonctionné.

    Peux-tu mettre un point d'arrêt sur la ligne : .lst0="--All--" then (en cliquant dans la marge à gauche, cela va mettre un gros point rouge) et puis exécuter ton code normalement en sélectionnant --All--.

    Access va s'arréter sur cette ligne, amène le curseur sur me.list0 et voit ce que Access affiche.

    A+

Discussions similaires

  1. [IP-2010] Filtre dynamique sur une zone de liste à sélection multiple
    Par Yoran_L dans le forum InfoPath
    Réponses: 3
    Dernier message: 02/06/2015, 12h12
  2. Réponses: 5
    Dernier message: 06/08/2012, 03h31
  3. récupérer les valeurs d'une zone de liste à sélection multiple
    Par garsflo dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/07/2009, 21h19
  4. Réponses: 2
    Dernier message: 06/06/2008, 16h18

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