J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil…
- User
J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil de filtre dynamique. L’idée étant que je puisse filtre une base de données dynamiquement (filtre au fur et à mesure de la saisie). Voici donc le script que j’utilise pour le UserForm que j’ai créé : Private Sub UserForm_Initialize() ' Remplir ComboBoxTableau Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject For Each lo In ws.ListObjects Me.ComboBoxTableau.AddItem lo.Name ' Changer pour ajouter le nom des tableaux Next lo Me.ComboBoxTableau.ListIndex = 0 ' Sélectionner automatiquement le premier tableau End Sub
Private Sub ComboBoxTableau_Change() ' Remplir ComboBoxColonne If Me.ComboBoxTableau.ListIndex > -1 Then Dim tblName As String tblName = Me.ComboBoxTableau.Text Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject Set lo = ws.ListObjects(tblName) Me.ComboBoxColonne.Clear Dim col As ListColumn For Each col In lo.ListColumns Me.ComboBoxColonne.AddItem col.Name Next col End If End Sub
Private Function IsNumberColumn(rng As Range) As Boolean Dim cell As Range For Each cell In rng If Not IsEmpty(cell) Then If IsNumeric(cell.Value) Then IsNumberColumn = True Else IsNumberColumn = False End If Exit For End If Next cell End Function
Private Sub TextBoxRecherche_Change() ' Filtrer en fonction de la recherche If Me.ComboBoxTableau.ListIndex > -1 And Me.ComboBoxColonne.ListIndex > -1 Then Dim tblName As String tblName = Me.ComboBoxTableau.Text Dim colName As String colName = Me.ComboBoxColonne.Text Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject Set lo = ws.ListObjects(tblName) Dim colRange As Range Set colRange = lo.ListColumns(colName).DataBodyRange
If Me.TextBoxRecherche.Text <> "" Then If IsNumberColumn(colRange) Then lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=" & Me.TextBoxRecherche.Text Else lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=*" & Me.TextBoxRecherche.Text & "*" End If DoEvents ' Forcer la mise à jour d’Excel Application.ScreenUpdating = True Else lo.AutoFilter.ShowAllData End IfEnd If End Sub
Maintenant je souhaite améliorer ce code. Obsérvation : après avoir saisi dans la boite de recherche (textBox) le tableau que je cherche à filtrer se filtre dynamiquement et cela au fur et à mesure que je tape. Après cela, j’interagis avec le tableau filtrer, et après avoir fait ce que j’avais à faire avec les données filtrées, je reviens dans la boite de recherche en cliquant n’importe où dans la fenêtre du boîte de recherche. C’est la que je cherche à améliorer. En effet lorsque je reactive la fenêtre du boîte de dialogue, j’aimerai que le texte que j’ai précedemment saisi dans le textBox soit séléctionné en totalité pour que je puisse de suite saisir le prochain filtre. Tel un pro du VBA mettez à jour mon code.
- Assistant
Pour ajouter cette fonctionnalité à votre code VBA, vous pouvez ajouter un gestionnaire d'événements qui détecte lorsque le TextBoxRecherche reçoit le focus et sélectionne tout le texte à l'intérieur.
Voici comment vous pouvez mettre à jour le code :
- Ajoutez la déclaration d'événement au début du code :
Private WithEvents TextBoxRecherche As MSForms.TextBox- Ajoutez cette sub-routine pour gérer l'événement GotFocus du TextBoxRecherche :
Private Sub TextBoxRecherche_GotFocus() ' Sélectionner tout le texte lorsque le TextBox reçoit le focus TextBoxRecherche.SelStart = 0 TextBoxRecherche.SelLength = Len(TextBoxRecherche.Text) End SubVoici votre code VBA mis à jour :
Private WithEvents TextBoxRecherche As MSForms.TextBox Private Sub UserForm_Initialize() ' Remplir ComboBoxTableau Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject For Each lo In ws.ListObjects Me.ComboBoxTableau.AddItem lo.Name ' Changer pour ajouter le nom des tableaux Next lo Me.ComboBoxTableau.ListIndex = 0 ' Sélectionner automatiquement le premier tableau ' Ajouter cette ligne pour définir la référence à TextBoxRecherche Set TextBoxRecherche = Me.TextBoxRecherche End Sub ' ... Votre code existant ... Private Sub TextBoxRecherche_GotFocus() ' Sélectionner tout le texte lorsque le TextBox reçoit le focus TextBoxRecherche.SelStart = 0 TextBoxRecherche.SelLength = Len(TextBoxRecherche.Text) End SubAvec cette mise à jour, lorsque vous cliquez dans la boîte de recherche après avoir interagi avec les données filtrées, le texte existant sera sélectionné en totalité, permettant de saisir directement le prochain filtre.