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 :

Boucle (code VBA) pour une requête de sélection [AC-2013]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut Boucle (code VBA) pour une requête de sélection
    Bonjour tt le monde !

    j’ai une requête de sélection que je dois répéter plusieurs fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE ((Candidat.X)= "1"));)
    Union
    (SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE ((Candidat.X)= "2"));)
    Union
    (SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE ((Candidat.X)=3));)
    est ce qu'il y a une façon d'utiliser une boucle (code VBA).

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 137
    Par défaut
    Bonjour,

    Pourquoi une boucle en VBA ?

    SQL suffit largement au job.

    Personnellement j'utiliserais un OR entre mes conditions. Dans la même requête, pas besoin d'UNION.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    J'avais un vieux code qui fait la même chose, j'espère; je l'ai adapté pour ton usage personnel:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub ListeCandidats()
     
    Dim ID As String
    Dim mySql, mySql1 As String
    Dim j As Integer
    Dim rs As Recordset
    Dim nbr As Long
    Dim vect() As Variant
    Dim qdfNew As QueryDef
     
    mySql1 = "SELECT TblCandidats.Delegation, TblCandidats.Genre, TblCandidats.X " & _
    "From TblCandidats WHERE TblCandidats.X='"
     
    Set rs = CurrentDb.OpenRecordset("TblCandidats")
    nbr = rs.RecordCount
    rs.Close
    Set rs = Nothing
     
    ReDim Preserve vect(nbr)
     
    For j = 1 To nbr - 1
        mySql = mySql1 & j & "'"
        mySql = mySql & vbLf & "Union All " & vbLf
        vect(j - 1) = mySql
    Next j
     
    vect(nbr) = "SELECT TblCandidats.Delegation, TblCandidats.Genre, TblCandidats.X " & _
    "From TblCandidats WHERE TblCandidats.X='" & nbr & "';"
     
    mySql = vect(0)
     
    For j = 1 To nbr
        mySql = mySql & vect(j)
    Next j
     
    DoCmd.SetWarnings False
        For Each qry In CurrentDb.QueryDefs
            If qry.Name Like "RequêteCandidats" Then DoCmd.DeleteObject acQuery, "RequêteCandidats"
        Next qry
    Set qdfNew = CurrentDb.CreateQueryDef("RequêteCandidats", mySql)
    DoCmd.SetWarnings True
     
    DoCmd.OpenQuery "RequêteCandidats"
     
    End Sub

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Merci!
    je vais le tester

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Par défaut
    Bonsoir

    Si tu veux rechercher tous les enregistrements de la table Candidat qui ont comme valeur de X 1 ou 2 ou 3, il faut faire tout simplement comme proposé par loubab, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE (((Candidat.X)="1" Or (Candidat.X)="2" Or (Candidat.X)="3"));
    C'est bien ça ?

    Titi95

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Tu peux peut-être aussi utiliser

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE Candidat.X in ("1", "2", "3");

    ou

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Candidat.Delegation, Candidat.Genre, Candidat.X
    FROM Candidat
    WHERE Candidat.X between "1"  and "3";

    Les requête union ne sont pas des plus efficaces.
    Une sélection sur les valeurs ou sur un interval est préférable.

    Note que la requête de titi95 avec des or est plus performante que la mienne avec le In() car le In() ne peut pas être optimisé par Access. Par contre in() permet du code plus "compact" surtout si tu as un paquet de valeurs. Et il y a aussi une limite à 2000 caractères pour le SQL donc connaître une syntaxe compacte peut s'avérer utile.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Bonjour
    Merci beaucoup

    Mon problème c'est que je veux sélectionné les 5 premiers candidats de chaque établissement
    et j'ai 150 établissements c.a.d répéter 150 fois le code suivant:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (SELECT TOP 5 Table2.NumEleve, Table2.NomCompleteFr, Table2.NomComplete, Table2.date_naissance, Table2.Delegation, Table2.Etablissement, Table2.TypeEtab, Table2.CodeEtab, Table2.Classe, Table2.MoyenneGen, Table2.MENTIONAR
    FROM Table2
    WHERE (((Table2.CodeEtab)=(SELECT EtabHaouz2.Codetab
    FROM EtabHaouz2
    WHERE (((EtabHaouz2.N°)=1)))))
    ORDER BY Table2.MoyenneGen DESC;)
     
    union
     
    (SELECT TOP 5 Table2.NumEleve, Table2.NomCompleteFr, Table2.NomComplete, Table2.date_naissance, Table2.Delegation, Table2.Etablissement, Table2.TypeEtab, Table2.CodeEtab, Table2.Classe, Table2.MoyenneGen, Table2.MENTIONAR
    FROM Table2
    WHERE (((Table2.CodeEtab)=(SELECT EtabHaouz2.Codetab
    FROM EtabHaouz2
    WHERE (((EtabHaouz2.N°)=2)))))
    ORDER BY Table2.MoyenneGen DESC;)

    c'est pourquoi je veux une boucle qui va me faciliter la tâche en donnant à (EtabHaouz2.N°) les valeurs de 1 à 150 sans répéter la requête 150 fois avec union.

    Merci

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/08/2012, 16h16
  2. Réponses: 4
    Dernier message: 22/12/2011, 02h22
  3. [AC-2007] Code VBA d'une requête de mise à jour
    Par Crachover dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/03/2010, 19h09
  4. Réponses: 6
    Dernier message: 23/08/2007, 09h49

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