Autres Doublon dans ComboBox et Trie

  • Initiateur de la discussion Initiateur de la discussion EricD59
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

EricD59

XLDnaute Nouveau
Bonjour le Forum, bonjour à toutes et à tous.

Je me présente, je me prénomme Eric et j'ai 61 ans.
Je suis dessinateur sur solidworks en tôlerie industrielle et actuellement sans emploi.

Pour ma première discussion voici le sujet :

J'ai une Listview alimenté par plusieurs tableaux issu de plusieurs feuilles.
J'ai créé 4 filtres, Dates, Mois, Catégories et Opérations. Jusque-là pas de problème.
Mais lorsque je filtre par dates mes autres filtres se mettes à jour suivant le nouveau
résultat dans la listview, mais je n'arrive pas à supprimer les doublons des nouveaux filtres
et à les trier dans l'ordre croissant.
Les filtres sont des ComboBox.

Merci à toutes et à tous pour votre aide.

Ps je joint un fichier test.
 

Pièces jointes

re
Bonjour
oui mais les fonctions d'utilisation que nous nous connaissons tous aujourd'hui à mon avis ne fonctionnent pas sur 2003
du plus loin que je me souvienne , ces tableaux ne fonctionnaient pas tout a fait pareil
mais je peux me tromper
perso je me rappelle pas les avoir utilisé avant 2007

edit:
oui c'est bien ce que je pensais
1745568021325.png


en 2003 c’était liste de donnée
donc tout ce qui est:
.ListObjects("xxxx")
.ListRows.Count
.DataBodyRange
etc...
n'existent pas sur 2003
 
Dernière édition:
bon bah.. pour la forme, je mets quand meme la dernière V3 dans laquelle j'ai réglé quelques soucis de filtrage de la listview lorsqu'on selectionne plusieurs filtres et qu'on en supprime un

j'ai aussi noté partout dans le code, les quelques endroits qu'il faudra retraiter pour ne plus exploiter des Listobjects, mais de simples tableaux "à l'ancienne"

il reste tout de même un dernier point qui me gêne.. le tri alpha sur les mois de la deuxième colonne
 

Pièces jointes

Bonjour à toutes et à tous, vgendron

Merci pour vos réponses.
Comme dit patricktoulon excel 2003 ne gère pas les tableaux structurés donc j'ai une erreur au niveau du module:

Private Sub Cbx_Compte_Change() 'Séléction Du Compte
Dim T() As Variant

EnableEvents = False
Cbx_Annee.Clear 'Vide les ComboBox
Cbx_Mois.Clear
Cbx_Operation.Clear
Cbx_OptTri.Clear
Cbx_Categorie.Clear

Tbx_Mois.Value = "" 'Vide les TextBox
Tbx_Opération.Value = ""
Tbx_Crédit.Value = ""
Tbx_Débit.Value = ""
Tbx_TotDébit.Value = ""
Tbx_TotCrédit.Value = ""
Tbx_Date.Value = ""
Tbx_Année.Value = ""
Tbx_Catégorie.Value = ""
Tbx_NumLigne.Value = ""

Set ws = ThisWorkbook.Sheets(Cbx_Compte.Value)
ws.Select 'on bascule sur la feuille du compte sélectionné

'*******************Remettre un traitement de tableau classique***************************************
With Worksheets(Cbx_Compte.Value).ListObjects(1) 'avec la TS de la feuille de compte
T = .ListColumns("Opérations").DataBodyRange.Value 'on place les données (hors entêtes) de la colonne "Opérations" dans le tablo vba
End With

T = Application.Transpose(RecupCollec(Doublons(T, 1))) 'On enlève les doublons, et on retranspose le résultat de RecupCollect
If UBound(T, 1) <> 1 Then TriMulti T, 1, LBound(T, 1), UBound(T, 1) ' On tri la liste
Cbx_Operation.List = T 'on colle la liste dans le combo

With ListView1
.ColumnHeaders.Clear 'Efface les entêtes de colonnes
.ListItems.Clear 'Efface les données de la Listview
End With

'*******************Remettre un traitement de tableau classique***************************************
'chargement des combo avec le contenu des TS de la feuille "Listes"
Call LoadCombo(Me.Cbx_OptTri, Sheets("Listes").ListObjects("t_OptTri"), 1)
Call LoadCombo(Me.Cbx_Categorie, Sheets("Listes").ListObjects("t_Catégories"), 1)
Call LoadCombo(Me.Cbx_Mois, Sheets("Listes").ListObjects("t_Mois"), 1)

Label16.Visible = False
Label21.Visible = True

Call ShowCustomDataInListView 'Appel la procédure Importation des données dans le formulaire , Certaines Colonnes
ListView1.AllowColumnReorder = True 'La propriété AllowColumnReorder autorise le déplacement des colonnes les unes par rapport aux autres, par un glisser/déposer.
Call ListViewColSymboleUSFormate 'Appel la procédure Format : €uro_Francs_Dates : De La ListView
EnableEvents = True
End Sub

Dommage que ça ne fonctionne pas avec Excel 2003 car tout le travail et le temps passé sont peine perdue.
Vgendron, je te remercie pour ton aide et ton excellent travail, si tu as d'autres pistes, j'en serrais ravit.
Passe une bonne journée @+EricD
 
re
c'est vrai que pour nous qui avons traversé les deux grande migration technologique de excel il est compliqué de revenir aux bases anciennes
perso je ne pourrais plus travailler avec du code spaguétti

perso
je reprendrais tout à zero

dans la feuille
je nommerais la ligne d’entête parfaitement possible avec 2003
je nommerais le reste parfaitement possible avec 2003
j'aurais ainsi un range pour (header") et un range avec le tableau de donnée

dans l'userform
a l'ouverture je variablise une variable tableau en globale module ce qui me permettra d'avoir mon tableau en entier
partie de la lors du change dans mes combo je crée une variable tableau avec les valeur dans colonne correspondant aux colonnes choisi

dans ce genre de travail le besoins est la vélocité (dans le cas ou la base de donnée grandirait) surtout que l'on travaille avec un listview qui ne peut se remplir que par une boucle a contrario d'une listbox à qui on peut faire avaler un .list avec une variable tableau

pour faire ce genre de travail j'utilise une astuce imparable en terme de rapidité
je collectionne les index de ligne et non les donnéees directement
quand j'ai tout mes index de ligne je crée une variable tableau avec application.index (tableau origal,letableau de ligne,letableau des colonne)

reste plus qu'a re nourrir la listvew apres un clear bien entendu

ca implique aussi que le remplissage doit se faire dans des macros ou fonctions séparées de l’initialise et appelé de l’initialise ainsi qu'au change des combobox de filtre

conclusion code moins spaguetti
plus clair et plus intelligible(même pour un débutant) même si on travaille avec un range au lieu d' un tableau structuré
A méditer 😉
patrick
 
Hello
@patricktoulon
tout à fait d'accord avec ton post 20: avoir un seul tableau complet dans lequel on pioche les données souhaitées est préférable.. ca évite de passer son temps à recharger la feuille
==> mais la. je me suis "contenté" de reprendre la logique déjà inscrite dans le fichier original

pour ta remarque post 21:
j'ai bien vu que le remplissage des combo était pas top.. selon le combo, c'est remplissage avec la totalité de le feuille, un coup, c'est selon le contenu de la listview
et en plus de ca (sans doute orgine du comportement "bancale"), il y a une mise à jour en cascade des combo quand un des combo est selectionné..
encore une fois, j'ai gardé la logique initiale.

pour le bug de la listview vide, il suffit d'ajouter un test entre le combo.clear et le t=ListViewInTab dans les différents Combo_Change

VB:
If Me.ListView1.ListItems.Count = 0 Then
        EnableEvents = True
        Exit Sub
    End If
 
Hello
@patricktoulon
tout à fait d'accord avec ton post 20: avoir un seul tableau complet dans lequel on pioche les données souhaitées est préférable.. ca évite de passer son temps à recharger la feuille
==> mais la. je me suis "contenté" de reprendre la logique déjà inscrite dans le fichier original

pour ta remarque post 21:
j'ai bien vu que le remplissage des combo était pas top.. selon le combo, c'est remplissage avec la totalité de le feuille, un coup, c'est selon le contenu de la listview
et en plus de ca (sans doute orgine du comportement "bancale"), il y a une mise à jour en cascade des combo quand un des combo est selectionné..
encore une fois, j'ai gardé la logique initiale.

pour le bug de la listview vide, il suffit d'ajouter un test entre le combo.clear et le t=ListViewInTab dans les différents Combo_Change

VB:
If Me.ListView1.ListItems.Count = 0 Then
        EnableEvents = True
        Exit Sub
    End If
Bonjour à toutes et à tous,

J'ai tester la version SANS les Tables structurées ça fonctionne sans bug en ajoutant le test :

If Me.ListView1.ListItems.Count = 0 Then
EnableEvents = True
Exit Sub
End If

Il est peut être plus simple de passer par 1 seule tableau comme dit vgendron.
j'ai trouver sur le net un fichier qui correspond à ce sujet , désoler je ne me souvient plus de l'auteur.
Ca fonctionne plutôt pas mal , mais je trouve le filtrage un peut lent.

Je le met en PJ.
Bonne journée à vous
 

Pièces jointes

re
bonjour
1° non le combobox pour "année "ne doit pas subir les autres filtressinon on est bloqué

2° et oui on vois bien que la avec 1142 lignes (ce qui est du pipi de chat pour excel) commence a ramer dans le filtrage

quand vous serez décidez on reprendra à zero si vous voulez
 
bonjour patricktoulon

Tout d'abord merci pour ta réponse et de t'on aide.
Je crois que le plus sage est de partir sur la base d'une seule feuille "Data ".
Quand penses-tu ?
Je voulais te préciser que mes connaissances en VBA sont limitées.
Je bricole des morceaux de codes et je les assemble pour en faire une application.
On pourra partir sur la base du dernier fichier " Test Listview Filtres ".

Encore merci. EricD
 
Bonjour @EricD59
j'ai pris 10/15 minute pour te faire un exemple
pour le coup comme pour moi c'etait un peu cahotique tout ce code j'ai tout supprimer et refait façon patosh
il te reste plus qu'a recoder correctement et proprement l'event click de la litview et les autres boutons
Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les cookies.
 

Pièces jointes

Re Bonsoir patricktoulon
j'ai testé ton fichier ça marche nickel Superbe travail ça filtre beaucoup plus vite.
C'est parfait pour moi encore merci.
Une petite chose :
Pourrez ton trier les filtres en ordre alpha J'espère ne pas trop en demander car pour moi c'est mission impossible.
Encore Merci Bonne soirée à toi
@+EricD
 
en attendant que je trouve une solution automatique
ajoute ça et quand tu cliquera sur les entête ca triera le listview par la colonne cliquée
VB:
Private Sub Listview1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    With Listview1
        .SortKey = ColumnHeader.Index - 1
        If .SortOrder = lvwAscending Then
            .SortOrder = lvwDescending
        Else
            .SortOrder = lvwAscending
        End If
        .Sorted = True
    End With
End Sub
si je n'arrive pas à trouver avec le sorting de la listview on passera tbl a la moulinette du quicksort multicolonne
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
69
Affichages
6 K
Retour