Skip to content
The Chat Archive
gpt-4-0314· OpenAI WildChat-4.8M (AI2)

J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil…

  1. 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 If
    

    End 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 ?

  2. Assistant

    Votre code est déjà relativement optimisé, mais voici quelques suggestions d'amélioration :

    1. Évitez d'utiliser plusieurs fois Me.TextBoxRecherche.Text et stockez sa valeur plutôt dans une variable pour réduire le nombre d'appels. De plus, vous pouvez utiliser Trim() pour supprimer les espaces avant et après le texte.
    2. Utilisez With pour améliorer la lisibilité du code.
    3. Utilisez un On Error Resume Next et On Error GoTo 0 pour 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 Sub
    

    Remarque : 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.