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

    cependant quand je transforme ce code en add-ins excel pour le generaliser dans excel, je recois une erreur en l'activant: Erreur d'exécution '380': Impossible de définir Ia propriété Listlndex. Valeur de propriété non valide.

  2. Assistant

    Le problème pourrait provenir de la ligne Me.ComboBoxTableau.ListIndex = 0. L'erreur 380 indique que la valeur de ListIndex est invalide. Cela pourrait arriver si la combobox ComboBoxTableau est vide au moment de l'exécution du code, ce qui signifie qu'aucun objet ListObject n'a été trouvé dans la feuille de calcul active.

    Voici quelques conseils pour résoudre cette erreur :

    1. Vérifiez que vous avez bien des tableaux (ListObjects) dans la feuille de calcul active lorsque vous exécutez le code.

    2. Vous pouvez ajouter une condition pour vérifier si ComboBoxTableau est vide avant de définir la valeur de ListIndex.

    Voici comment vous pouvez modifier la procédure UserForm_Initialize :

    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
    If Me.ComboBoxTableau.ListCount > 0 Then
        Me.ComboBoxTableau.ListIndex = 0 ' Sélectionner automatiquement le premier tableau
    Else
        MsgBox "Aucun tableau trouvé dans la feuille active.", vbInformation, "Information"
    End If
    End Sub
    

    Cette modification vérifiera si la combobox a des éléments et définira la valeur de ListIndex en conséquence. Si la combobox est vide, un message d'information s'affichera pour informer l'utilisateur qu'aucun tableau n'a été trouvé dans la feuille active.

    Assurez-vous également que les tableaux de la feuille active sont bien des objets "ListObject". Si vous avez des tableaux qui ne sont pas des objets "ListObject", vous devrez les convertir en "ListObject" pour que le code fonctionne correctement. Vous pouvez le faire en sélectionnant le tableau, en cliquant sur l'onglet "Tableau" dans le ruban Excel, puis en cliquant sur "Convertir en tableau".

  3. User

    Malheuresement le tableau dans la feuille active n'est toujours pas détécter

  4. Assistant

    Dans ce cas, il se peut que la feuille active au moment de l'exécution du code ne soit pas la feuille contenant les tableaux. Essayons de modifier le code pour rechercher les tableaux dans l'ensemble des feuilles du classeur plutôt que dans la seule feuille active.

    Modifiez la procédure UserForm_Initialize comme suit :

    Private Sub UserForm_Initialize()
    ' Remplir ComboBoxTableau
    Dim ws As Worksheet
    Dim lo As ListObject
    
    For Each ws In ThisWorkbook.Worksheets ' Parcourir toutes les feuilles du classeur
        For Each lo In ws.ListObjects
            Me.ComboBoxTableau.AddItem lo.Name ' Changer pour ajouter le nom des tableaux
        Next lo
    Next ws
    
    If Me.ComboBoxTableau.ListCount > 0 Then
        Me.ComboBoxTableau.ListIndex = 0 ' Sélectionner automatiquement le premier tableau
    Else
        MsgBox "Aucun tableau trouvé dans le classeur.", vbInformation, "Information"
    End If
    End Sub
    

    Cette modification permettra de parcourir toutes les feuilles du classeur et de rechercher des objets "ListObject" dans chacune d'elles. Si votre tableau est présent dans l'une des feuilles du classeur, il devrait être détecté et ajouté à la combobox ComboBoxTableau.

    Veuillez noter que vous devrez également ajuster les autres parties du code pour gérer correctement les feuilles de calcul auxquelles les tableaux appartiennent. Dans les procédures ComboBoxTableau_Change() et TextBoxRecherche_Change(), vous devriez rechercher la feuille contenant le tableau sélectionné par son nom.

    Je vous recommande d'ajouter une nouvelle procédure pour obtenir la feuille de calcul contenant le tableau :

    Private Function GetWorksheetFromTable(tblName As String) As Worksheet
        Dim ws As Worksheet
        Dim lo As ListObject
        For Each ws In ThisWorkbook.Worksheets
            For Each lo In ws.ListObjects
                If lo.Name = tblName Then
                    Set GetWorksheetFromTable = ws
                    Exit Function
                End If
            Next lo
        Next ws
    End Function
    

    Puis, modifiez ComboBoxTableau_Change() pour utiliser cette fonction :

    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 = GetWorksheetFromTable(tblName) ' Trouver la feuille contenant le tableau
        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
    

    Et modifiez également TextBoxRecherche_Change() pour utiliser cette fonction :

    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 = GetWorksheetFromTable(tblName) ' Trouver la feuille contenant le tableau
        Dim lo As ListObject
        Set lo = ws.ListObjects(tblName)
        Dim colRange As Range
        Set colRange = lo.ListColumns(colName).DataBodyRange
    ' ...
    

    Ces modifications permettront au code de rechercher des tableaux dans toutes les feuilles du classeur et de gérer correctement les feuilles contenant ces tableaux.