Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Excel VBA] Moteur de recherche "filtrant"

Sujet résolu
    14 janvier 2013 à 14:29:49

    Bonjour,

    Tout d'abord je tiens à remercier les personnes qui prendront le temps me de lire, voire de m'aider sur ce sujet.

    Je créé actuellement sur un classeur Excel, une base de données qui rassemble des textes juridiques (réglementation Code du Travail, etc.)

    Mon souhait est d'y intégrer un moteur de recherche.

    Lorsque l'utilisateur saisit un mot-clé dans ce moteur de recherche, je voudrai que les lignes qui contiennent ce mot-clé soient filtrées et s'affichent en dessous.

    Je vous mets à disposition ma base de données :

    https://docs.google.com/file/d/0B8PYYfNcNCA4U2dOWmVUS1ZnaUU/edit

    Ainsi qu'un exemple contenant la fonction que je souhaite intégrer à mon classeur (ligne 9 : à vous d'essayer) :

    https://docs.google.com/file/d/0B8PYYfNcNCA4b0wxaThIaEJjbVk/edit

    Bonne journée.

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2013 à 16:08:51

      Bonjour je n'ai pas accès à Google doc depuis mon poste, du coup j'ai une question :
      Est que la recherche du mot-clé peut porter sur plusieurs colonnes ?

      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2013 à 10:42:27

        Oui, la recherche du mot-clé peut porter sur plusieurs colonnes.

        N'hésitez pas à me fournir votre courriel par MP pour que je vous joigne les fichiers Excel.

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2013 à 11:12:22

          J'ai réussi à récupérer vos documents, du coup je vous ai proposé une 1ère ébauche du fichier. Pour les autres zéros, voici la macro que j'ai créé :
          Option Explicit
          ' Sub Filtrer
          ' Permet de filtrer un mot-clé sur tous les filtres d'une feuille
          ' Les plages de cellules visibles sont ensuite récupérées pour afficher les lignes où le mot clé a été trouvé
          ' Attention toutefois, nous émulons la fonction de filtrage par ce moyen mais en aucun cas les filtres sont activés naturellement
          Sub Filtrer(sMotRecherche As String)
              ' Déclaration des variables
              Dim mFilter As AutoFilter
              Dim rngFilter As Range
              Dim cell As Range
              Dim rngPlageResultat As Range
              Dim rngTableauValeur As Range
              Dim lDerniereLigneExcel As Long
              Dim i As Long
              
              'lDerniereLigneExcel = Application.Cells.SpecialCells(xlCellTypeLastCell).End(xlDown).Row
              
              If ActiveSheet.AutoFilterMode Then
                  ' Désactivation des événements pour gagner en vitesse d'éxécution
                  Application.ScreenUpdating = False
                  Application.Calculation = xlCalculationManual
                  Application.EnableEvents = False
                  
                  ' Définition de la plage des filtres
                  Set rngFilter = ActiveSheet.AutoFilter.Range '1er filtre
                  Set rngFilter = rngFilter.Resize(1, rngFilter.Columns.Count) 'tous les filtres
                  
                  
                  ' Reset de tous les filtres, au cas où des valeurs auraient déjà été sélectionnées
                  For Each cell In rngFilter
                      cell.AutoFilter Field:=cell.Column
                  Next cell
                  
                  ' Si aucun mot de recherche on reset les filtres seulement et on sort
                  If sMotRecherche = "" Then Exit Sub
                  
                  
                  ' Définition de la plage du tableau complet
                  'Set rngTableauValeur = ActiveSheet.Range(rngFilter.Offset(1, 0), Cells(lDerniereLigneExcel, rngFilter.Columns.Count).End(xlUp))
                  Set rngTableauValeur = ActiveSheet.Range(rngFilter.Cells(1).Address).CurrentRegion
                  
                  ' Récupération des plages des cellules visibles
                  On Error Resume Next
                  For Each cell In rngFilter
                      cell.AutoFilter Field:=cell.Column, Criteria1:="=*" & sMotRecherche & "*"
          
                      If rngPlageResultat Is Nothing Then
                          Set rngPlageResultat = rngTableauValeur.SpecialCells(xlCellTypeVisible)
                      Else
                          Set rngPlageResultat = Union(rngPlageResultat, rngTableauValeur.SpecialCells(xlCellTypeVisible))
                      End If
          
                      ' Raz du filtre
                      cell.AutoFilter Field:=cell.Column
                  Next cell
                  On Error GoTo 0
                  
                  
                  ' Masquage ou affichage des lignes
                  For i = 1 To rngTableauValeur.Rows.Count
                      For Each cell In rngTableauValeur.Rows(i).Cells
                          'Si la cellule figure dans la plage de résultat on affiche la ligne
                          If Not Intersect(cell, rngPlageResultat) Is Nothing Then
                              rngTableauValeur.Rows(i).EntireRow.Hidden = False
                              Exit For
                          Else
                              'sinon on la cache
                              rngTableauValeur.Rows(i).EntireRow.Hidden = True
                          End If
                      Next cell
                  Next i
                  
                  ' Réactivation des événements
                  Application.Calculation = xlCalculationAutomatic
                  Application.EnableEvents = True
                  Application.ScreenUpdating = True
              End If
          End Sub
          
          
          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2013 à 14:36:05

            Fonctionne à 100% merci Hindioumax
            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2013 à 11:09:33

              Salut à tous,

              Désoler de faite remonter le sujet si tard, mais j'essaie également de créer un moteur de recherche.

              J'ai trouvé votre solution mais les fichiers ne sont malheureusement plus accessible.

              Comme je suis novice en VBA, ces fichiers me seraient utile en tant qu'exemple.

              Si l'auteur du post passe par là :D

              Merci

              • Partager sur Facebook
              • Partager sur Twitter

              [Excel VBA] Moteur de recherche "filtrant"

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown