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

Macros et VBA Excel Discussion :

Mise en place moteur de recherche [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Par défaut Mise en place moteur de recherche
    Bonjour à tous,

    Je suis en train de réaliser une base de donnée référençant diverses documentations techniques à l'occasion d'un petit travail. J'ai besoin de votre aide pour réaliser un moteur de recherche.
    Je les ai triées Lot par Lot, un lot correspondant à une feuille.

    Mon moteur de recherche fonctionne sur un système de mots clés séparés par des espaces ou bien des virgules s'il le faut. Et, les recherches sont ciblées sur une colonne (A) d'une seule feuille du classeur, déterminées avant la saisie de mot clés par l'utilisateur.

    Actuellement le travail que j'ai réalisé me permet d'effectuer une recherche dans un Userform, en fonction de la feuille (lot) choisit, mais cette recherche ne filtre pas toute le contenu des cellules.

    Par exemple, j'entre dans la colonne mots clés pour une documentation technique les mots : isolation;béton;celullaire

    Si je veux retrouver cette documentation technique, je dois réinscrire les mots dans le même ordre, or j'aimerais que cette documentation apparaissent en ne saisissant par exemple que "béton" ou encore "cellulaire;béton".

    Voici mon code

    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
    Private Sub TextBox1_Change()
    Dim Lot As String
    Dim Plage As Range, cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, n As Integer
    Dim C As Range
    ListBox1.Clear
    Lot = Range("O19")
    n = 0
    Recherche = TextBox1.Value
    Range("A1").Select
    Ligne = Sheets(Lot).Range("A" & "65536").End(xlUp).Row
    Set Plage = Sheets(Lot).Range("a" & "1:" & "a" & Ligne)
    With Plage
    Set C = .Find(Recherche, , xlValues)
    If Not C Is Nothing Then
    Adresse = C.Address
    Do
        If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
              ListBox1.AddItem C.Offset(0, 0), n
            ListBox1.List(n, 0) = C.Offset(0, 1)
             ListBox1.List(n, 1) = C.Offset(0, 2)
              ListBox1.List(n, 2) = C.Offset(0, 3)
               ListBox1.List(n, 3) = C.Offset(0, 4)
                ListBox1.List(n, 4) = C.Offset(0, 5)
                 ListBox1.List(n, 5) = C.Offset(0, 6)
                  ListBox1.List(n, 6) = C.Offset(0, 7)
                    n = n + 1
        End If
        Set C = .FindNext(C)
        Loop While Not C Is Nothing And C.Address <> Adresse
        End If
    End With
    End Sub
    Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 9
    ListBox1.ColumnWidths = "110;300;150;40;80;120"
    End Sub
    Je vous joints également un extrait de la base de donnée.

    J'espère que vous pourrez m'aider, je suis débutant, j'ai réalisé ce code VBA en compilant diverses lignes de codes de différents classeurs que j'ai trouvés et en l'adaptant à ma base de donnée.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Vous pouvez utiliser la fonction Match qui permet de vérifier si une valeur est présente dans un tableau ainsi que la fonction Split qui sépare une chaîne de caractère en sous-chaîne et les entre dans un tableau.
    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
    Private Sub TextBox1_Change()
        Dim Lot As String
        Dim Plage As Range, cell As Range
        Dim Recherche() As String, MotsCles() As String
        Dim Adresses() As Long
        Dim Ligne As Integer, n As Integer
        ListBox1.Clear
        ReDim Adresses(0)
        Lot = Range("O19")
        Recherche = Split(UCase(TextBox1.Value), ";")
        Ligne = Sheets(Lot).Range("A" & "65536").End(xlUp).Row
        Set Plage = Sheets(Lot).Range("a" & "1:" & "a" & Ligne)
        For Each cell In Plage
            For n=0 To Ubound(Recherche)
                MotsCles = Split(UCase(cell.Value), ";")
                If Application.WorksheetFunction.Match(Recherche(n), MotsCles, 0)
                    If Adresses(0) <> "" Then ReDim Preserve Adresses(Ubound(Adresses) + 1)
                    Adresses(Ubound(Adresses))=cell.Address
                    Exit For
                End If
            Next n
        Next cell
    End Sub
    Le tableau Adresses contient alors toutes les addresses des cellules pour lesquelles une correspondance de mot clé a été trouvée.
    En remplaçant les lignes 17 et 18 du code ci-dessus, il devrait être facile de réaliser les actions que vous souhaitez plutôt que de simplement stocker les adresses.

    Cdt

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Essaie ceci :

    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
    Private Sub TextBox1_Change()
    Dim Lot As String, Dico As Object
    Dim Plage As Range, cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, n As Integer, I As Long
    Dim C As Range, Tabl, Plage1 As Range
    Set Dico = CreateObject("Scripting.Dictionary")
    ListBox1.Clear
    Lot = Range("O19")
    n = 0
    Recherche = TextBox1.Value
    Tabl = Split(Recherche, ";")
    Sheets(Lot).AutoFilterMode = False
    Ligne = Sheets(Lot).Range("C" & "65536").End(xlUp).Row
    Set Plage = Sheets(Lot).Range("C" & "4:" & "C" & Ligne)
    With Plage
        For I = 0 To UBound(Tabl)
            .AutoFilter
            .AutoFilter 1, "*" & Tabl(I) & "*"
            Set Plage1 = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
            If Application.Subtotal(103, Plage1) > 0 Then
                Set Plage1 = Plage1.Offset(, -1).SpecialCells(xlCellTypeVisible)
                For Each C In Plage1
                    If Not Dico.exists(C.Offset(, 1).Value) Then
                        Dico.Add C.Offset(, 1).Value, C.Offset(, 1).Value
                        ListBox1.AddItem C.Offset(0, 0), n
                        ListBox1.List(n, 1) = C.Offset(0, 1)
                         ListBox1.List(n, 2) = C.Offset(0, 2)
                          ListBox1.List(n, 3) = C.Offset(0, 3)
                           ListBox1.List(n, 4) = C.Offset(0, 4)
                            ListBox1.List(n, 5) = C.Offset(0, 5)
                             ListBox1.List(n, 6) = C.Offset(0, 6)
                              ListBox1.List(n, 7) = C.Offset(0, 7)
                                n = n + 1
                    End If
                Next C
            End If
        Next I
    End With
    End Sub

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Par défaut
    Bonjour à vous Daniel C et Ben_L. Je vous remercie pour l'aide que vous m'apporter. Je n'ai pas reussis à me servir de la fonction Match, cependant le second code m'a beaucoup aidé, tout simplement car il reprenait plus la structure que j'avais commencé à travailler, c'était plus facile pour moi à comprendre étant vraiment novice. Je commence à avancer dans ce que je recherche. Je l'ai adapté une nouvelle fois à mon fichier, cela donne :

    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
    Private Sub TextBox1_Change()
    Dim Lot As String, Dico As Object
    Dim Plage As Range, cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, n As Integer, I As Long
    Dim C As Range, Tabl, Plage1 As Range
    Set Dico = CreateObject("Scripting.Dictionary")
    ListBox1.Clear
    Lot = Range("Q19")
    n = 0
    Recherche = TextBox1.Value
    Tabl = Split(Recherche, ";")
    Sheets(Lot).AutoFilterMode = False
    Ligne = Sheets(Lot).Range("A" & "65536").End(xlUp).Row
    Set Plage = Sheets(Lot).Range("a" & "4:" & "a" & Ligne)
    With Plage
        For I = 0 To UBound(Tabl)
            .AutoFilter
            .AutoFilter 1, "*" & Tabl(I) & "*"
            Set Plage1 = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
            If Application.Subtotal(103, Plage1) > 0 Then
                Set Plage1 = Plage1.Offset(, 0).SpecialCells(xlCellTypeVisible)
                For Each C In Plage1
                    If Not Dico.exists(C.Offset(, 1).Value) Then
                        Dico.Add C.Offset(, 1).Value, C.Offset(, 1).Value
                        ListBox1.AddItem C.Offset(0, 1), n
                         ListBox1.List(n, 2) = C.Offset(0, 2)
                          ListBox1.List(n, 3) = C.Offset(0, 3)
                           ListBox1.List(n, 4) = C.Offset(0, 4)
                            ListBox1.List(n, 5) = C.Offset(0, 5)
                             ListBox1.List(n, 6) = C.Offset(0, 6)
                              ListBox1.List(n, 7) = C.Offset(0, 7)
                                n = n + 1
                    End If
                Next C
            End If
        Next I
    End With
    End Sub
    Les changements que j'ai apportés sont mineurs, je souhaitait ne filtrer que la colonne A, et ne pas afficher les mots clés dans mon résultat.

    Maintenant dans l'utilisation cela correspond presque à ce que je recherche, l'idée est qu'en fait, une fois le premier mot clés saisie on obtient un premier trie de la documentation. On rentre ensuite un second mot, séparé par un ";" qui trie de nouveau le premier résultat, puis un troisième si nécessaire, qui filtre de encore le précédent résultat, de manière à obtenir une documentation répondant précisément à la recherche. Pour l'instant ce n'est qu'une esquisse il n'y a donc que très peu de mots clés et très peu de documentation, mais à l'avenir le fichier risque d'être conséquent.

    Est-ce que mon idée est envisageable ?
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Oui, sauf que, si je rentre "béton;cellulaire" je vais retrouver deux fois la ligne 5 de la feuille LOT1. ou j'ai mal compris ?

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Par défaut
    En fait, j'avais dans l'idée que les résultats se suppriment au fur et à mesure que la recherche se précise avec les mots clés.

    Exemple : Je veux rechercher une documentation C, dans une base qui en contient 3 A, B et C.

    A = Béton précontraint
    B = Isolation dalle béton
    C = Béton cellulaire

    Dans mon moteur de recherche, je tape dans un premier temps :

    "Béton"--> Trois documentations associées A, B et C

    Ensuite,

    "Béton;cellulaire" --> Une documentation associée, la C. Les documentations A et B ont été retirées des résultats car elles ne comprennent pas le mot "cellulaire" en plus de "béton" dans leur mots-clés.

    Merci du temps que vous m'accordez, ça m'aide beaucoup dans mon travail, j'ai envie de réaliser une base de donnée pratique et bien ficelée.

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Telle que c'est conçu actuellement, avec une base :

    A = Béton précontraint
    B = Isolation dalle béton
    C = Plastique cellulaire
    D = Béton cellulaire

    si tu entres "Béton;cellulaire", A, B C et D s'affichent. Si tu entres "Béton cellulaire", seul D s'affiche. Mais c'est comme tu veux.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/02/2014, 13h12
  2. Mise en place d'un moteur physique
    Par Hybrix dans le forum Physique
    Réponses: 15
    Dernier message: 25/11/2007, 22h44
  3. [PHP-JS] Mise en place d'une fonction recherche
    Par barbapapa2 dans le forum Langage
    Réponses: 6
    Dernier message: 02/12/2006, 19h03

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