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

    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.

  2. Assistant

    Je vais ajouter quelques lignes de code pour sélectionner automatiquement le texte dans la TextBox lorsque vous cliquez à l'intérieur de celle-ci. Voici le code mis à jour pour le UserForm :

    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
    
    ' Ajout du code pour sélectionner le texte dans la TextBox lorsqu'elle est activée
    Private Sub TextBoxRecherche_Enter()
        TextBoxRecherche.SelStart = 0
        TextBoxRecherche.SelLength = Len(TextBoxRecherche.Text)
    End Sub
    

    J'ai ajouté une nouvelle procédure événementielle TextBoxRecherche_Enter() qui est déclenchée lorsque la TextBox reçoit le focus, par exemple lorsqu'elle est cliquée. Cette procédure sélectionne le texte dans la TextBox en définissant SelStart à 0 et SelLength à la longueur du texte. Ainsi, lorsque vous cliquerez sur la TextBox, le texte sera automatiquement sélectionné et prêt pour la prochaine saisie.