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 :

Choisir les filtres avant un recordset


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Choisir les filtres avant un recordset
    Bonjour à tous,

    J'ai effectué une requête SQL qui me retourne un recordset dans une feuille et j'affiche les X lignes avec 8 colonnes.

    Afin d'améliorer l'utilisation de ce tableau, j'aimerais avoir la possibilité de le filtrer la requête en fonction d'une colonne.



    J'imaginais un UserForm qui viendrait extraire uniquement le champ que je veux filtrer (dans mon cas une récurrence) et qui permettrais au final d’effectuer la requête SQL réduite.
    Dans ce style :



    Je sèche un peu, j'aimerais donc avec des avis sur la façon de me lancer de cette fonctionnalité.
    C'est la première fois que je poste sur un forum, je suis d'habitude spectateur des discussions alors, je reste bien évidemment à votre disposition pour vous donner un maximum d'informations.

    Merci d'avance.

  2. #2
    Responsable
    Office & Excel

    Salut.

    Nous avons besoin de la structure de la base de données pour pouvoir t'aiguiller vers une solution, car il est impossible de déterminer comment cette récurrence a été modélisée dans la base...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Futur Membre du Club
    Bonjour,

    Merci d'avoir pris du temps pour me répondre.

    Donc, pour commencer, c'est un fichier Excel avec du VBA, j'ai fait une connexion avec un ADODB à ma base de donnée. Ce qui me permet de faire des requêtes SQL et de récupérer le résultat à l'aide de recordset.

    Voici la partie FROM de ma requête, j'ai uniquement besoin de travailler sur ces tables ci-dessous.
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    article 
    LEFT JOIN gamcon ON ((article.idart=gamcon.idart)) 
    LEFT JOIN gamcar ON ((gamcon.idqua=gamcar.idqua)) 
    LEFT JOIN unigen ON ((gamcar.iduni=unigen.iduni))
    LEFT JOIN fregam ON ((gamcar.idfre=fregen.idfre)) 
    LEFT JOIN resgen ON ((gamcar.idres=resgen.idres)) 
    LEFT JOIN famille ON ((gamcar.idfamille=fammes.idfamille)) 
    LEFT JOIN cargen ON ((gamcar.idcar=cargen.idcar))



    J'aimerais filtrer sur un champ fréquence dans la table fregam.


    J'avais pensé faire une première requête pour récupérer toutes les fréquences suivant certains filtres, afin d'ajouter des cases à cocher pour que l'utilisateur vienne choisir ses propres filtres.

    Cette solution me semble quand même assez farfelu et je suppose qu'il y a probablement d'autres solutions moins complexe ?

    Merci d'avance.

  4. #4
    Responsable
    Office & Excel

    Je ne vois pas trop comment tu pourrais faire autrement qu'une première requête pour récupérer les fréquences, puis une deuxième incluant les fréquences choisies. J'émets plus de réserves sur le fait de choisir les fréquences par cases à cocher car cela va t'obliger à devoir ajouter dynamiquement des contrôles. Perso, je m'orienterais plus vite vers une listbox multi-sélection.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Futur Membre du Club
    Je n'avais pas pensé à cette option, comme quoi...
    Je pense que ça va effectivement simplifier ma démarche, merci.
    Je vais développer ça début de semaine prochaine, je reviendrais ici pour donner des nouvelles !

    Merci.

  6. #6
    Futur Membre du Club
    Bonjour,

    J'ai un peu avancé sur le sujet et votre solution est effectivement beaucoup plus adapté à mon besoin, j'ai maintenant une nouvelle interrogation.

    J'affichais jusque-là, le résultat de mes requêtes à l'intérieur de cellules à l'aide d'un CopyFromRecordset:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Worksheets("MENU").Range("C20").CopyFromRecordset rst


    J'aimerais donc savoir comment afficher/boucler le résultat de cette requête dans une listbox/msgbox ?

    Merci d'avance.

  7. #7
    Responsable
    Office & Excel

    Un adodb.Recordset expose la propriété GetRows qui renvoie un array (tableau VBA). Ce tableau est "inversé" ou transposé, c'est-à-dire que les lignes représentent les champs et les colonnes représentent les enregistrements.

    Les ListBox et combobox permettent d'être alimentés par des arrays:
    • ComboBox.List permet de recevoir un array bien formé (colonnes = champs et lignes = enregistrements)
    • ComboBox.Column permet de recevoir un array transposé, tel que le renvoie GetRows.



    Du coup, voici un code qui peut fonctionner
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Dim rs As ADODB.Recordset
     
      set rs = ...
      With UserForm1
        .ComboBox1.Column = rs.getRows
        .Show
      End With



    Idéalement, une bonne architecture de code décomposerait la manoeuvre en une fonction qui renvoie l'array, qui est alors utilisé pour alimenter le combobox ou le listbox.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel

    J'ai écrit 4 billets pour expliquer comment modéliser les interactions avec Access. Voici le lien de la discussion liée à ces billets, qui contient les liens vers le blog. En espérant que cela puisse t'aider.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Futur Membre du Club
    J'ai terminé cette partie de mon code grâce à ton aide. Celle-ci m'a été très précieuse et très appréciée.
    Je passe le sujet en résolu, merci beaucoup pour ton temps !