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éé : Code du module: Public Sub AfficherBoiteDeRecherche() ' Appeler le formulaire RechercheForm.Show End Sub
Code pour le UserForm : 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 Private Sub TextBoxRecherche_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Sélectionner tout le texte dans TextBoxRecherche lorsque l'utilisateur clique dessus Me.TextBoxRecherche.SelStart = 0 Me.TextBoxRecherche.SelLength = Len(Me.TextBoxRecherche.Text) End Sub
Pouvez optimiser ce code ?
- Assistant
Votre code est déjà relativement optimisé, mais voici quelques suggestions d'amélioration :
- Évitez d'utiliser plusieurs fois
Me.TextBoxRecherche.Textet stockez sa valeur plutôt dans une variable pour réduire le nombre d'appels. De plus, vous pouvez utiliserTrim()pour supprimer les espaces avant et après le texte. - Utilisez
Withpour améliorer la lisibilité du code. - Utilisez un
On Error Resume NextetOn Error GoTo 0pour faciliter la gestion des erreurs lorsque vous essayez d'afficher toutes les données.
Voici le code modifié avec ces suggestions :
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 Dim searchText As String searchText = Trim(Me.TextBoxRecherche.Text) If searchText <> "" Then If IsNumberColumn(colRange) Then lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=" & searchText Else lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=*" & searchText & "*" End If DoEvents ' Forcer la mise à jour d'Excel Application.ScreenUpdating = True Else On Error Resume Next lo.AutoFilter.ShowAllData On Error GoTo 0 End If End If End SubRemarque : Le code ci-dessus est déjà assez optimisé et il est important de noter que les performances du code VBA peuvent être limitées par la taille et la complexité des données, surtout en travaillant avec de grandes feuilles de calcul Excel. Dans ces cas, il peut être préférable d'envisager d'autres approches pour améliorer les performances, telles que l'utilisation de fonctions Excel natives ou l'importation des données dans une base de données pour effectuer les opérations de filtrage.
- Évitez d'utiliser plusieurs fois