Erreur non repertoriée sur Listbox.Clear + filtrage de données dans listbox

Bonjour à toutes et à tous,

J'ai une erreur non répertoriée quand j'écris Listbox.Clear()

J'ai du mal à comprendre pourquoi. De plus le principal objectif est de filtrer une listbox (multi colonnes) via une combobox. En effet, dans la colonne d'index 3, il y a 4 types d'état et j'aimerais filtrer par état la listbox

J'ai donc écris ceci :

Private Sub Cbx_Etat_Filtre_Change()
    Dim selectedType As String
    Dim i As Long
    Dim j As Long
    Dim filteredData As Variant
    Dim filteredIndex As Long

    selectedType = Cbx_Etat_Filtre.value

    Lbx_reparations.Clear        ' Efface les éléments actuellement affichés dans la ListBox

        ' Parcourir les lignes de données dans la ListBox
        For i = 0 To Lbx_reparations.ListCount - 1
            ' Vérifier si la colonne correspondante contient le type sélectionné
            If Lbx_reparations.List(i, 3) = selectedType Then
                ' Ajouter la ligne à un tableau de données filtrées
                filteredIndex = filteredIndex + 1
                ReDim Preserve filteredData(1 To Lbx_reparations.ColumnCount, 1 To filteredIndex)
                For j = 0 To Lbx_reparations.ColumnCount - 1
                    filteredData(j + 1, filteredIndex) = Lbx_reparations.List(i, j)
                Next j
            End If
        Next i

        ' Afficher les données filtrées dans la ListBox
        If filteredIndex > 0 Then
            Lbx_reparations.Column = filteredData
        End If
End Sub

Néanmoins, l'erreur Lbx_reparations.Clear persiste....

Merci par avance,

A+

image image

Bonjour MPETIT,

Je ne comprends pas la logique du code ci-joint : Dans l'extrait de code, la ligne Lbx_reparations.Clear au début de la procédure supprime tous les éléments de la ListBox donc la boucle qui suit ne peut pas s'exécuter puisque Lbx_reparations.Listcount vaut -1.

En cliquant sur "Débogage" quelle est la ligne mise en exergue dans le code ?

Pour un réel diagnostic, il faudrait communiquer le fichier (anonymisé).

Cdlt,

Cylfo

Bonjour Cylfo,

Désole de ma réponse tardive.

Tu as raison et voici le fichier (les données sont obsolètes).

Identifiant : adf

mdp : aze

Une fois la connexion effectuée, clique sur le bouton "Suivi des réparations". C'est dans cette boite de dialogue que j'aimerais appliquer le filtre.

Pour rappel de l'objectif initial : J'aimerais que la listbox soit contraint par un filtre comprenant 4 états possibles. Tu trouveras une colonne se nommant "ETAT" dans la listBox.

En espérant que cela puisse t'aider.

Bien cordialement,

10excel-pratique.zip (1.47 Mo)

Bonjour MPETIT,

La listbox "Lbx_reparations" est initialisée dans la procédure "UserForm_Activate" via la propriété "RowSource" avec l'ensemble des données et l'affichage des en-têtes de colonnes. Ensuite tu veux filtrer sur un état donné (*) mais tu filtres sur la listbox, il y a 2 soucis :

1 - donc tu ne peux plus utiliser la propriété "RowSource", il faut l'effacer .RowSource ="" avant d'affecter le tableau à la propriété ".Column" (l'erreur vient de là) mais tu perds les en-têtes de colonne (et il me semble "fortement" que les en-têtes ne sont disponibles qu'en utilisant la propriété "RowSource") ...

2 - une fois que tu as filtré sut un état, tu ne peux plus filtrer sur un autre état puisqu'il n'est plus présent dans la ListBox ...

* : La ComboBox "Cbx_Etat" est initialisée avec la valeur "En panne", il faut l'initialiser à vide sinon tu ne peux pas filtrer en premier sur la valeur "En panne" (il n'y a pas de changement donc l'événement "Change" n'est pas déclenché ...).

Donc il faut que tu changes la méthode de chargement, une piste : créer une procédure de chargement générique de la Lbx_reparations" à partir des données de la feuille "SUIVI_OP" avec un paramètre "sEtat as String" qui si vide charge toutes les données et si renseigné ne charge que les données répondant au critère "sEtat". Procédure que tu appelles à l'initialisation et au changement de "Cbx_Etat".

Sur le forum, il y a tout plein d'exemples. A ta disposition si besoin.

Cdlt,

Cylfo

Bonsoir MPETIT, Cylfo,

Le formulaire porteur de la ListBox a été modifié partiellement selon les codes ci-dessous.

En premier une variable lastRow accessible sur plusieurs procédures

Dim nLigne As Long
Dim Etat As String
Dim nom_REAP As String
Dim email_REAP As String
Dim AE_en_reparation As String
Public lastRow As Long 'Variable utilisable sur cette page de code
Option Explicit

Et mise en commentaire sur l'initialisation du formulaire

Private Sub UserForm_Activate()

Dim ws As Worksheet
'Dim lastRow As Long *** voir code en haut de page
Dim dataRange As Range
Dim cell As Range
Dim rowData As Variant
Dim j As Intege

Suite,

Pour la fin de l'initialisation du formulaire, la ligne .RowSource est remplacée par une ligne .List reprenant les données de la feuille.

' Trouvez la dernière ligne avec des données dans la colonne A
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'Attribution de la zone de données à dataRange
Set dataRange = Sheets("SUIVI_OP").Range("A3:L" & lastRow)
With Lbx_reparations
    .List = dataRange.Value
    '.RowSource = "SUIVI_OP!A3:L" & lastRow
    .ColumnHeads = True
    .ColumnWidths = "80;80;80"
End With

Et étant aussi dans une procédure de réinitialisation de la ListBox. Vu qu'elle est amenée à être régulièrement filtrée.

Private Sub ListeTotale()
Dim rangeData As Range
'Attribution de la zone de données à dataRange
Set rangeData = Sheets("SUIVI_OP").Range("A3:L" & lastRow)
Lbx_reparations.List = rangeData.Value
End Sub

Enfin,

Pour la partie filtrage. Voir les commentaires en ***** pour la modification du code

Private Sub Cbx_Etat_Filtre_Change()
    Dim selectedType As String
    Dim i As Long
    Dim j As Long
    Dim filteredData As Variant
    Dim filteredIndex As Long
    Dim N As Long
    '***** Rappel de la liste complète *****
    Call ListeTotale
    selectedType = Cbx_Etat_Filtre.Value

    'Lbx_reparations.Clear     ' Efface les éléments actuellement affichés dans la ListBox
     N = Lbx_reparations.ListCount - 1
        ' Parcourir les lignes de données dans la ListBox
        For i = 0 To N
    '***** Parer à toute erreur lors du Filtrage en sortant de la procédure ******
        On Error GoTo Fin
            ' Vérifier si la colonne correspondante contient le type sélectionné
            'If Lbx_reparations.List(i, 3) = selectedType Then
    '**** Ecarter les données non correspondantes à celles recherchées ******
            If Lbx_reparations.List(i, 3) <> selectedType Then
                ' Ajouter la ligne à un tableau de données filtrées
    '**** Afin de les ôter de la ListBox pour l'actualiser *****
            Lbx_reparations.RemoveItem i: i = i - 1: N = N - 1
                'filteredIndex = filteredIndex + 1
                'ReDim Preserve filteredData(1 To Lbx_reparations.ColumnCount, 1 To filteredIndex)
                'For j = 0 To Lbx_reparations.ColumnCount - 1
                    'filteredData(j, filteredIndex) = Lbx_reparations.List(i, j)
                'Next j
            End If
        Next i
Fin:
        ' Afficher les données filtrées dans la ListBox
        'If filteredIndex > 0 Then
            'Lbx_reparations.Column = filteredData
        'End If
End Sub

Le but étant d'éjecter tout ce qui ne correspond pas à la recherche. Il reste donc que ce qui est souhaité.

Mais il faudra prévoir une colonne clé qui sauvegarde le numéro de ligne de chaque donnée afin de pouvoir cibler et modifier convenablement les colonnes de celle-ci sur la feuille SUIVI_OP. Notamment la colonne Etat qui verra sa valeur changée si besoin.

Bonjour MPETIT,

Ci-jointe une autre proposition / approche. Tout le code est contenu dans la procédure "Cbx_Etat_Filtre_Change". La ListBox "Lbx_Reparations" conserve ses titres car j'utilise la propriété "RowSource". Tu peux sélectionner une valeur de filtre "ETAT" pour n'afficher que les enregistrements correspondant à cet état ou effacer le filtre pour afficher tous les enregistrements.

J'ai ajouté une colonne "Tri_ETAT_UF" (colonne M) dans le tableau de l'onglet "SUIVI_OP", elle vaut 0 si l'état de la ligne correspond au critère de filtre stocké dans la cellule M1 nommée "V_ETAT_FILTRE" ou si "V_ETAT_FILTRE" est vide et 1 dans les autres cas.

Dans la procédure "Cbx_Etat_Filtre_Change" :

  1. La cellule "V_ETAT_FILTRE" est alimentée avec la valeur du filtre choisi
  2. Le tableau de l'onglet "SUIVI_OP" est trié sur la colonne "M" donc les enregistrements à filtrer (colonne M = 0) sont en premier.
  3. Une formule nommée "ZONE_FILTRE_SRM" utilise la fonction "DECALER" pour dimensionner la plage de cellules correspondant aux enregistrements à afficher (colonne M = 0)
  4. La formule nommée "ZONE_FILTRE_SRM" est affectée à la propriété "RowSource" de la ListBox "Lbx_Reparations"

SI cette solution t'intéresse, il faudra que tu adaptes le code qui actualise le tableau de l'onglet "SUIVI_OP" pour y ajouter la formule en colonne M (je pourrai le faire si tu le souhaites).

Attention : sur mon poste je n'ai pas "Microsoft Windows Common Controls-2 6.0 (SP6)" et je l'ai décoché donc il faudra que tu le rajoutes.

Cdlt,

Cylfo

Bonjour Messieurs,

Désolé de la réponse tardive.

Merci de votre aide. Je suis fortement intéressé par la solution de Cylfo mais malheureusement je n'arrive pas à la faire fonctionner sur mon fichier. J'aimerais voir si le filtrage fonctionne bien mais j'ai une erreur à la ligne

 .SortFields.Add2 Key:=Range("M:M"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

Je vous renvoie le fichier où j'ai rajouté la colonne M, la cellule "v_ETAT_FILTRE" ainsi que le code Cbx_Etat_Filtre_Change().

Merci

Bien cordialement,

Bonjour MPETIT,

Il manquait la déclaration des plages nommées "ZONE_SRM" et "ZONE_FILTRE_SRM", je les ai ajoutées à la version ci-jointe. Attention : j'ai décoché "Microsoft Windows Common Controls-2 6.0 (SP6)".

Cdlt,

Cylfo

Bonjour Cylfo,

C'est à n'y rien comprendre....

J'ai ajouté les désignations manquantes comme indiquées ci-dessus. J'ai toujours la même erreur.

J'ai donc voulu utiliser ton fichier directement en rajouter la référence "Windows Control .... mais rien n'y fait...

Voici la ligne et l'erreur :

image image

Bonjour MPETIT,

Effectivement ... je viens de refaire un test avec le dernier fichier que j'ai envoyé et ça fonctionne nickel et nous avons la même version d'Excel ... La seule différence que je vois est que j'ai la référence "Microsoft Windows Common Controls-2 6.0 (SP6)" décochée : peux-tu refaire un test en repartant du fichier "4-2" que j'ai envoyé en ne rajoutant pas cette référence, te connecter et tester "Suivi des réparations" : As-tu le même problème ?

Cdlt,

Cylfo

Cylfo,

Je viens de suivre vos instructions et rien n'y fait...

J'ai dl votre fichier et j'ai toujours la même erreur.

Voici les références à l'ouverture :

image

MPETIT,

Là ! je suis perplexe ! Vous avez toujours le même code erreur 438 ? (sinon me faire une copie d'écran s.v.p.)

Je vois que nous n'avons pas les mêmes versions des librairies Excel et Office (Vous 15.0, moi 16.0) et qu'il vous manque celle d'Outlook. Donc j''ai fait une modification sans grande certitude mais ... à essayer quand même ...

Cdlt,

Cylfo

Bonjour Cylfo,

Après de multiples tests et recherches.... Je crois avoir trouvé la solution.

Il fallait remplacer Add2 par Add.

L'erreur est résolue ! Merci beaucoup pour ton aide :)

Bien cordialement,

Bonjour MPETIT,

Impec ! Du coup, j'ai cherché et trouvé sur le site , Add2 n'est pas supporté par les versions 15.0 des librairies Excel qui sont liées à la version 2013 d'Excel mais uniquement à partir des versions 16.0 et Excel 2016.

Dans tes copies d'écran, je vois bien la v15.0 pour les librairies et dans ton profil tu indiques Excel 2019, je ne savais pas que le mixage était possible.

Cdlt,

Cylfo

Rechercher des sujets similaires à "erreur repertoriee listbox clear filtrage donnees"