Moteur de recherche lent

Bonjour

Décidément, les moteurs de recherche ce n'est pas simple. J'ai le cerveau en ébullition ! Aussi avant que ça ne chauffe de trop, je me tourne vers vous une fois de plus ! Messieurs les développeurs, j'ai besoin de vos connaissances, oh combien précieuses.

Le code ci-dessous s’exécute bien mais qu'est-ce que c'est long !!! En l'état ce n'est pas jouable !

J'imagine qu'il analyse ligne par ligne et vu que le fichier est volumineux c'est l'enfer ! Au secours !

Qui plus est la valeur cherchée ne s'affiche dans ma Textbox qu'à l'issue de la recherche et j'ai l'impression que la recherche se fait les caractères les uns après les autres. Ce qui n'arrange pas mes affaires !!

L'idée est de pouvoir rechercher une valeur saisie via la txtbox et qui serait comprise dans la colonne A (code) et une fois trouvée de filtrer sur la ligne correspondante.

Si la valeur n'est pas trouvée, afficher une msgbox qui dit "valeur non trouvée, vérifier votre saisie"

+ le bouton "Réinitialiser" pour revenir à la base de données.

+ si possible une réinitialisation de la base de la feuille concernée par défaut à l'ouverture ou fermeture du classeur. Sachant qu'il comporte plusieurs feuilles.

image
Option Explicit
Option Compare Text

Private Sub Worksheet_Activate()

    'Réinitialise la recherche et le filtrage
    If TextBox1.Text <> "" Then TextBox1.Text = "" _
    Else init_rech
    With Range("tableau4").ListObject
        .AutoFilter.ShowAllData
    End With

End Sub

Private Sub init_rech() 'Initialisation de la recherche

    With Range("tableau4").ListObject
        .Range.Cells(8, 1).Select
        .DataBodyRange.EntireRow.Hidden = False
        .DataBodyRange.Interior.ColorIndex = xlNone
    End With
'    TextBox1.Clear

End Sub
Public Sub BoutonReinitialiser_Click() 'Code relatif au bouton Reset qui est sur la feuille et sur le userform

    Worksheet_Activate

End Sub
'Recherche filtrante
Private Sub TextBox1_Change()

    Dim cell As Range, i As Long, lig As Long, col As Long, nbt As Integer

    Application.ScreenUpdating = False

    'If TextBox1 = Empty Then init_rech: Exit Sub

    If TextBox1.Value <> "" Then
    End If
    '  TextBox1.Clear
    With Range("tableau4").ListObject
        'Restauration du filtrage initial
       ' .AutoFilter.ShowAllData: Filtrer crit1, crit2, crit3

        'Restauration de la recherche
        .DataBodyRange.Interior.ColorIndex = xlNone
        .DataBodyRange.EntireRow.Hidden = False

        'Nouvelle recherche
        For i = 1 To .ListRows.Count
            Set cell = .ListRows(i).Range.Find(TextBox1.Value)
            If cell Is Nothing Then
                .ListRows(i).Range.EntireRow.Hidden = True

       End If

        Next i
    End With

End Sub
25version-xlp.zip (147.89 Ko)

Bonsoir,

veuillez trouvez ci joint votre fichier dont la base de données a été intégrée sur une application en ma possession.
il me semble que cela va vite, non ?

Un champ de recherche "contient" et la liste box du dessous se remplie et se vide en fonction des données.
Un double-clic sur la liste box de l'élément voulu l'affiche sur la feuille.

@ bientôt

LouReeD

Merci LouReed mais cela ne correspond pas vraiment à mon besoin.

Bonsoir

L'idée est de pouvoir rechercher une valeur saisie via la TextBox et qui serait comprise dans la colonne A (code) et une fois trouvée de filtrer sur la ligne correspondante.

donc un TextBox pour faire la recherche et il est vrai que c'est différent à partir de là, au lieu de filtrer il faut faire un double-clic sur les noms restants affichés dans la ListBox. Alors lors du clic lancez un filtre sur la valeur de la liste box sélectionnée...

Vous pouvez tout de même voir la rapidité de la recherche, et vous pouvez vous appuyez sur le code pour le modifier et l'adapter à votre besoin.

@ bientôt

LouReeD

je veux que le tableau soit directement filtré et non avoir à faire un double clique sur la valeur filtrée dans la listbox que vous proposez.

merci quand même de votre contribution mais je confirme que cela ne correspond pas à mon besoin initial.

Au lieu de ceci :

        For i = 1 To .ListRows.Count
            Set cell = .ListRows(i).Range.Find(TextBox1.Value)
            If cell Is Nothing Then
                .ListRows(i).Range.EntireRow.Hidden = True

       End If

        Next i

rechercher le code VBA pour filtrer un tableau avec un critère "contient"... Ce sera plus rapide que de chercher les "ne contient pas"...

@ bientôt

LouReeD

Un peu comme ceci :

Private Sub TextBox1_Change()
    With ActiveSheet.ListObjects("Tableau4")
        ' suppression du filtre existant
        .Range.AutoFilter Field:=1
        ' mise en place du filtre "contient"
        .Range.AutoFilter Field:=1, Criteria1:= _
        "=*" & TextBox1.Value & "*", Operator:=xlAnd
    End With
End Sub

@ bientôt

LouReeD

Cool, ça correspond bien à ce que je voulais ça ! nickel

une idée pour ajouter un msgbox si la valeur n'est pas trouvée stp ?

Même si on le comprend aisément du fait que le filtre ne remonte rien mais un petit message pour le dire serait encore mieux !

Merci de l'aide apportée.

bonjour LouReed, Marinekali,

on ne peut pas améliorer un autofilter, comme LouReed vous montre

23version-xlp.zip (162.57 Ko)

Merci à vous.

Juste une chose pourquoi quand je tape la première lettre du code la recherche elle remonte aussi des codes commençant par une autre lettre.

En effet il faut que je saisisse 2 caractères minimum pour qu'elle affiche les lignes correspondantes.

image image

Le filtre est "contien" modifiez le en "commence par" en supprimant la première étoile...

@ bientôt

LouReeD

Merci, au top !

Bonjour,

merci pour ce retour, et remerciement !

@ bientôt

LouReeD

Rechercher des sujets similaires à "moteur recherche lent"