Probleme de tri multiple et doublon

Akeya06

XLDnaute Occasionnel
Bonjour le forum,

Je viens une fois de plus abuser de votre savoir et de votre patience. j'aimerais, via un USF, faire des tris multiples et que les résultats s'affichent sans doublons. J'ai bien essayé de trouver une solution dans les archives, mais sans succès. Voici une démo pour illustrer tout ca. Je pense que cela sera plus clair.

D'avance merci à vous...
Akeya06 ;) [file name=trisansdoublons.zip size=35108]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/trisansdoublons.zip[/file]
 

Pièces jointes

  • trisansdoublons.zip
    34.3 KB · Affichages: 34

Bebere

XLDnaute Barbatruc
bonjour Akeya
ajouté une combobox pour les données de colonne A
regarde si c'est ce que tu veux
remarque bienvenue
à bientôt [file name=trisansdoublons_20051015160108.zip size=29742]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/trisansdoublons_20051015160108.zip[/file]
 

Pièces jointes

  • trisansdoublons_20051015160108.zip
    29 KB · Affichages: 42

Akeya06

XLDnaute Occasionnel
Bonjour Bébère, re le forum,

Merci à toi pour ton aide. Pour ce qui est de la combobox à la place des optionsbutton pour le choix des étages, aucun souci. Par contre, lorsque j'ai déja sélectionné un étage et consulté des données dans les autres champs et que je veux refaire un autre choix d'étage, la, le reste de mes listbox se retrouve vide. Saurais d'ou cela viens ? Serais ce possible d'éviter les doublons dans la listbox du code cuve ?

Merci pour ta patience...
Akeya06 ;)
 

Akeya06

XLDnaute Occasionnel
Bonjour Bébère, le forum

Merci de te pencher sur mon problème. Pour ce qui est du doublon, donc là, 1101, c'est parce que pour le même code cuve, il y a plusieurs dates de changement de mano dans la colonne 'H', et ce que je souhaiterais, c'est qu'il m'affiche dans la listbox1 le code cuve mais sans doublon, et dans la listbox2 toutes les dates correspondant à ce code cuve. J'espère etre clair dans mes explications.

Merci à toi
Akeya06 ;)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Akeya, Bébère, le Forum

Je n'ai ouvert aucun fichier de ce fil, mais vu que l'on y parle d'incrémenter des données sans doublon dans des ListBox, je conseille ce Fil où je viens de mettre des explications détaillées sur une méthode de sioux ;)

=> Lien supprimé

Vous y trouverez deux fichiers démo aussi, un d'Hervé et le mien, s'appuyant sur cette méthode simple et efficace.

Bon Dimanche
[ol]@+Thierry[/ol]

PS Akeya pour un meeting sur Monaco, je t'ai répondu en PM.
 

Akeya06

XLDnaute Occasionnel
Bonjour Thierry,

Je viens de passer un bon moment sur le fil, et j'en ressort avec un bon mal de tête :unsure: . Je dois dire que je suis perdu, car lorsque je change les données dans les colonnes, plus rien n'apparait dans les combo et listbox. Et vu mon niveau, je n'arrive pas à décortiquer le code pour comprendre le pourquoi du comment :whistle: . Le second probleme et que je dois faire plus de tri et etre plus precis dans les infos qui vont s'afficherdans mon USF. En fait j'ai dans mon fichier pas moins de 11 onglets que je dois gérer différement car ils n'ont pas le meme type d'infos. Pour certains le travail est déja fait, mais il m'en reste quelques uns ou je perds pied... :eek:

Je parcours les archives mais sans grand résultats
Akeya06 ;)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
=> DEMO UserForm tri multiple/suppression doublons

Re Bonjour enfin Bonsoir Akeya, Bébère, le Forum

Bon alors vu que tu vas me payer au moins l'apéro la semaine prochaine, voici en accompte une démo sur mesure sur ton fichier de Base, pas vraiment simple à expliquer...

Ce n'est qu'une Beta Version, il est probable que tu auras des Bugs à chasser sur des manips que je n'ai pas prévues.

Je pense que j'aurai droit à une seconde pression LOL !

Bonne Soirée
[ol]@+Thierry[/ol] [file name=USF_Sort_Filter_Cascade.zip size=33236]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/USF_Sort_Filter_Cascade.zip[/file]
 

Pièces jointes

  • USF_Sort_Filter_Cascade.zip
    32.5 KB · Affichages: 61

Akeya06

XLDnaute Occasionnel
Re:=> DEMO UserForm tri multiple/suppression doublons

Mon cher Thierry, bébère, le forum

Une fois de plus, merci beaucoup pour l'aide que vous mettez à nos disposition. C'est exacatement ce qu'il me fallait. De plus je vais donc pouvoir finaliser mon projet mon mon boulot. Et pour ce qui est de l'apéro, il est clair que tu n'y échapperas pas ;) ... Je te téléphonerais lundi en 17 pour se mettre d'accord sur le lieu et l'heure...

Encore milles merci...
Akeya06 ;)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:=> DEMO UserForm tri multiple/suppression doublons

Bonjour Akeya, bébère, le Forum

Heureux que celà corresponde à tes besoins, si tu dois l'utiliser dans ton Job, il faudra peut-être un peu blinder tout ceci car comme je disais ce n'est qu'une Beta version.

Sinon c'est fou ce que l'on peut faire pour un apéro !!! lol

Bonne Journée
[ol]@+Thierry[/ol]

PS j'attends ton coup de fil
 

Bebere

XLDnaute Barbatruc
Re:=> DEMO UserForm tri multiple/suppression doublons

bonjour Thierry,Akeya
Thierry,un grand merçi pour cette belle leçon de programmation
je me joindrais volontier à vous,mais vu la distance(+ de 100km)
difficile
amitiés et à bientôt
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:=> DEMO UserForm tri multiple/suppression doublons

Bonjour Akeya, Bébère, le Forum

Ah Bébère +100Km de Monaco, tu dois être dans les Alpes de Haute Provence vers Digne, ou bien dans le Var
entre Manosque et Draguignan, ou sur le bord de mer entre Sainte Maxime et Hyeres... A moins que tu ne soies en Italie ...

Enfin quand tu veux, tu peux passer par ici, tu seras toujours le bienvenu.

Merci également des compliments.

Bon Aprèm
[ol]@+Thierry[/ol]
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:=> DEMO UserForm tri multiple/suppression doublons

Bonjour à tous et toutes

J'ai eu l'occasion de déjeuner avec Akeya qui est for sympa. Il me posait quelques questions de compréhension, donc voici quelques explication sur une partie des codes employées et particulièrement pour le 'Tri'...

Private Sub TriTablo(ByVal C0 As Byte)
Dim T As Variant
Dim x As Integer, j As Integer, i As Integer, ii As Integer
Dim Tmp1 As String, Tmp2 As String, Tmp3 As String, Tmp4 As String
Dim Tmp5 As String, Tmp6 As String, Tmp7 As String, Tmp8 As String, Tmp9 As String

   
'Part AAA
With Database
   
If .FilterMode = True Then .ShowAllData
    T = .Range('A2:H' & .Range('A65536').End(xlUp).Row)
End With

   
'Part BBB
   
For i = 1 To UBound(T, 1)
       
If T(i, 1) <> '' Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
ReDim Preserve Tablo(8, x)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(0, x) = CStr(T(i, 1))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(1, x) = CStr(T(i, 2))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(2, x) = CStr(T(i, 3))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(3, x) = CStr(T(i, 4))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(4, x) = CStr(T(i, 5))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(5, x) = CStr(T(i, 6))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(6, x) = CStr(T(i, 7))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(7, x) = CStr(T(i, 8))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(8, x) = CStr(i + 1)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = x + 1
&nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp;
Next
&nbsp; &nbsp; &nbsp; &nbsp;
'Part CCC
&nbsp; &nbsp; &nbsp; &nbsp;
For i = LBound(Tablo, 2) To UBound(Tablo, 2)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For j = LBound(Tablo, 2) + ii To UBound(Tablo, 2)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If Tablo(C0, i) > Tablo(C0, j) Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tmp1 = Tablo(0, j): Tmp2 = Tablo(1, j): Tmp3 = Tablo(2, j): Tmp4 = Tablo(3, j)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tmp5 = Tablo(4, j): Tmp6 = Tablo(5, j): Tmp7 = Tablo(6, j): Tmp8 = Tablo(7, j): Tmp9 = Tablo(8, j)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(0, j) = Tablo(0, i): Tablo(1, j) = Tablo(1, i): Tablo(2, j) = Tablo(2, i): Tablo(3, j) = Tablo(3, i)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(4, j) = Tablo(4, i): Tablo(5, j) = Tablo(5, i): Tablo(6, j) = Tablo(6, i): Tablo(7, j) = Tablo(7, i): Tablo(8, j) = Tablo(8, i)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(0, i) = Tmp1: Tablo(1, i) = Tmp2: Tablo(2, i) = Tmp3: Tablo(3, i) = Tmp4
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tablo(4, i) = Tmp5: Tablo(5, i) = Tmp6: Tablo(6, i) = Tmp7: Tablo(7, i) = Tmp8: Tablo(8, i) = Tmp9
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Next j
&nbsp; &nbsp; &nbsp; &nbsp; ii = ii + 1
&nbsp; &nbsp; &nbsp; &nbsp;
Next i

End Sub

Explications :

Part AAA
C’est un moyen d’envoyer toute la feuille dans la mémoire, c’est mille fois plus rapide que de travailler sur les cellules.

Je dois préciser dans quelle feuille, donc c’est ici :
With Database
NB Database est le Nom « CodeName » de la Feuille et pas le nom d’onglet (voir propriétés de la Feuille)

Au cas où, je libère la feuille de tout filtre automatique
If .FilterMode = True Then .ShowAllData

Et maintenant j’envoie toute la plage dans la mémoire dans une Array (Tableau) de type Variant « T »
T = .Range('A2:H' & .Range('A65536').End(xlUp).Row)


Part BBB
Voici la construction d’un tableau dynamique indexé séquentiellement de type String « Tablo() ».
Il faut savoir que par défaut, ce genre de Tableau est en base 0 (il démarre par la valeur 0 niveau ligne et colonne du premier enregistrement)

Mon algo est basé sur le nombre d’enregistrement contenu dans mon premier Tableau « T » obtenu en AAA. Je le mesure grace à cette instruction :
For i = 1 To UBound(T, 1)

Un condition, qui pourrait être bien plus pointue, ici c’est si colonne 1 de la ligne « i » est différent vide…
If T(i, 1) <> '' Then

Et c’est parti, il suffit que je dimensionne mon tableau « Tablo » comme suit :
ReDim Preserve Tablo(8, x)

Ce qui signifie au premier passage de al boucle, 8 lignes sur x colonne (x étant à 0). On notera que contrairement à « T » ce « Tablo » est inversé. (Obligatoire, on ne peut changer que la seconde dimension en Redim), mais ce n’est pas grave, contrairement à une feuille Excel, ce genre de tableau n’est pas limité à 255 colonnes. En fait c’est juste une vision de l’esprit, mais il faut bien comprendre que l’on est à l’envers.

Ensuite c’est une partie de mise en place toute simple :
Tablo(0, x) = CStr(T(i, 1))
On voit bien d’ailleurs que Tablo(0, x) (Colonne 0, Ligne x) = T(i, 1) (Ligne i, Colonne 1)
Soit à l’envers et en base Zéro
La petite exception sera la dernière incrémentation de données
Tablo(8, x) = CStr(i + 1)
Qui en fait consiste à envoyer le numéro de Ligne de « T » (qui correspond à celui de la Feuille + 1) dans le « Tablo » pour pouvoir le réutiliser plus tard à des fins de modifications sur la feuilles….

Et on incrémente notre « x » pour le passage suivant :
x = x + 1

Le « CStr » est juste là pour une conversion de données pour avoir du type String.


Part CCC

Cette partie est un Algo qui va trier les items du tableau en s’appuyant sur une Double Boucle en décalage sur les lignes du Tableau. (Cette façon de faire a un nom que j’ai oublié, si quelqu’un peut me rafraîchir la mémoire)

En clair :
For i = LBound(Tablo, 2) To UBound(Tablo, 2) (boucle « i »)
Suivi de :
For j = LBound(Tablo, 2) + ii To UBound(Tablo, 2) ) (boucle « j »)

Génère cette Double Boucle en décalage, le décalage étant assuré par ii.

Ensuite, et bien il suffit de lire ce qu’il se passe :
If Tablo(C0, i) > Tablo(C0, j) Then
Ceci est la condition pour vérifier si ce qui est dans la boucle i est plus grand que dans la boucle J

Si tel est le cas on envoie dans une variable temporaire la valeur de ce qui est dans la boucle j :
Tmp1 = Tablo(0, j)
On aura autant de Variable Tmp que de colonne à traiter.

Ensuite on va envoyer en position j ce qui était dans la position i par cette instruction :
Tablo(0, j) = Tablo(0, i)

Il ne restera plus qu’à récupérer la valeur de la variable temporaire pour la remettre en i
Tablo(0, i) = Tmp1



Passage d’Argument

Avant de partir vers de nouvelles aventures, il serait dommage qu’un tel Algo ne serve qu’une fois… Donc
Private Sub TriTablo(ByVal C0 As Byte)

Et donc C0 est une variable en passage d'argument qui permet de faire mon tri sur la colonne que je souhaite, il suffit de passer l’argument en appelant la procédure
TriTablo 1 (colonne 2 de « Tablo » soit « Chaine »…
Comment ça Colonne 2 ??? si si si, zavez déjà oublié !!!
..... on est en base zéro, donc 1 = 2ème colonne (0, 1, 2)

Ou plus tard
TriTablo 2 (pour la troisième colonne « Code »)

Simple non ?

Bonne fin de journée
[ol]@+Thierry[/ol]
 

Discussions similaires

Statistiques des forums

Discussions
312 332
Messages
2 087 365
Membres
103 528
dernier inscrit
maro