Demande d'info sur la, propriété "SORTED" d'une listbox

nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010 - 18 juin 2007 à 23:13
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 11 mars 2008 à 10:49
Bonjour à tous,

J'ai une listbox contenant des titres sous forme de date + nom, se référant à des documents scannés. Ex:
15.06.2007
02.04.2005
03.04.2004
etc ...

Je voudrais trier ces dates de la plus ancienne à la plus récente, et que la plus récente apparaissent tout en haut de ma listbox.

PROBLEME:

1/ Si j'utilise "Sorted" les dates ne sont absolument pas triées, puisque "sorted" trie en fonction du 1er chiffre, en l'occurence ici les dates seront triées comme ceci: 02.04.2005 > 03.04.2004>15.06.2007
Donc ce n'est pas la bonne solution.

2/ si j'utilise ce code : "lstNono.AddItem DateScanne, 0" le dernier document scanné apparaitra tout en haut de ma listbox (génial !!) mais les dates ne seront pas triées correctement comme dans l'exemple 1/

3/ Si mes dates sont enregistrées de cette manières :
2007.06.15
2005.04.02
2004.04.03

etc ...
les dates sont correctement triées par "sorted", càd 2004.04.03>2005.04.02>2007.06.15 (ouais !!!) mais la date la plus récente est en bas de la listbox, ce qui est embêtant lorsqu'il y a plusieurs documents scannés, il faut utiliser le curseur pour visualiser le document le plus récemment scanné !!

4/L'idéal serait d'avoir des dates triées, avec la plus récente en haut de la listbox et de préférence sous ce format 15.06.2007 !!!!!

Quelqu'un aurait-il une idée ?

Merci d'avance pour vos réponses

Nono

48 réponses

yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
18 juin 2007 à 23:56
Salut, rapidement, je peux te filer une astuce:

le plus simple est de créer une listbox qui a la propriété sorted = true et de la rendre visible false (appelons la List2)

le but est de faire une fonction qui prend les items de ta listbox, les formats de telle sorte qu'ils puissent être triés puis les restitue au bon format:

en gros, on copie tous les items dans un listbox tempon (ici List2)
les valeurs sont ajoutées au format YYYYMMDD afin de faire une comparaison numérique
avec la propriété Sorted=True les items sont triés dans l'ordre croissant
ensuite on vide la listbox d'origine
on prend le résulat obtenu par le trie
on recré les items dans la listbox d'origine avec le format souhaité:DD.MM.YYYY

en gros ça donne:
-----------------------------------------------------------------------------------------
Private Sub ListBoxSort(ByVal MyListBox As ListBox)
   
    Dim i As Long
   
   
    List2.Clear
    For i = 0 To MyListBox.ListCount - 1
        List2.AddItem Right(MyListBox.List(i), 4) & Mid(MyListBox.List(i), 4, 2) & Left(MyListBox.List(i), 2)
    Next
   
    MyListBox.Clear
    For i = 0 To List2.ListCount - 1
        MyListBox.AddItem Right(List2.List(i), 2) & "." & Mid(List2.List(i), 5, 2) & "." & Left(List2.List(i), 4)
    Next
   
End Sub
-----------------------------------------------------------------------------------------

c'est un peu barbare mais ça marche, bien évidemment il ne faut pas 500000 items...sinon c'est un peu long ;-)

en espérant que cela t'aide @+
   

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
18 juin 2007 à 23:58
PS: pour ma fonction je suis parti du format DD.MM.YYYY
je précise pour les lignes du genre : Right(MyListBox.List(i), 4) & Mid(MyListBox.List(i), 4, 2) & Left(MyListBox.List(i), 2)

re @+

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
19 juin 2007 à 07:08
Tu peux les insérer triées, c'est surement le plus simple...

Pour chaque element a a ajouter
     si la liste est vide, on l'ajoute
     si la liste n'est pas vide, on cherche ou l'ajouter :
          pour chaque element (ou par dichotomie, pour accelerer), on regarde s'il doit être placé avant notre nouvel item
                s'il doit etre placé avant, on continue a regarder les elements
                sinon, on place notre nouvel element, on a trouvé sa place

tu y gagnera, je pense, en rapidité (une seule insertion dans la liste). Et ca n'est pas très complexe a mettre en place.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 08:19
Bonjour,

Juste un rappel de l'aide en ligne (pour le cas où on voudrait retrier une listbox) :

L'aide en ligne précise que l'on peut forcer l'emplacement en faisant une insertion et en précisant l'index d'insertion ...

Donc (exemple) :

Private Sub Form_Activate()
  List1.AddItem "2005/04/02"
  List1.AddItem "2005/05/01"
  List1.AddItem "2007/06/15"
  List1.AddItem "2004/04/03"
End Sub




Private Sub Command1_Click()
  ReDim toto(List1.ListCount) As String
  comb = List1.ListCount - 1
  For i = comb To 0 Step -1
   toto(i) = Format(List1.List(comb - i), "dd/mm/yyyy")
  Next
  List1.Clear
  For i = 0 To comb
    List1.AddItem toto(i), i
  Next
End Sub

Rigolo, non ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 08:57
Bonjour à tous,

Thanks pour vos réponses.
Je vais étudier vos propostitions durant la journée et je vous tiens au courant en cas de difficultés

Merci
Nono
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
19 juin 2007 à 09:43
re-Salut

Voici en gros ce que donnerai la proposition de Rey:

--------------------------------------------------------------------------------------------------

Private Sub Command1_Click()


    Call LstAddItem("15.06.2007")
    Call LstAddItem("03.04.2004")
    Call LstAddItem("02.04.2005")


End Sub


Private Sub LstAddItem(ByVal Texte As String)
   
    Dim i As Long
   
    For i = 0 To List1.ListCount - 1
        If Val(Right(List1.List(i), 4) & Mid(List1.List(i), 4, 2) & Left(List1.List(i), 2)) > Val(Right(Texte, 4) & Mid(Texte, 4, 2) & Left(Texte, 2)) Then
            Exit For
        End If
    Next
    List1.AddItem Texte, i


End Sub

---------------------------------------------------------------------------------------------------

avec cette fonction, chaque fois que tu ajoute un item il est automatiquement placé à la bonne place.

Contrairement à rey, je ne sais pas si tu y gagneras forcément, disons que c'est plus en fonction de ton appli.
Je m'explique : (Rey n'hésite pas à me contredire biensur)
1) ton appli charge un bonne fois pour toute une liste de dates :
         - là j'obterais pour ma solution. en effet au final tu remplies 3 fois une listbox (enfin 2+1) mais au moins tu ne la reparcours pas à chaque insertion.....donc ça peut etre plus rapide
2) ton appli ajoute des dates lorsque l'utilisateur utilise l'appli...en gros cela se fait au fur et à mesure :
         - là j'obterais pour la solution de Rey au moins l'item est directement classer.

=> Conclusion:
Combine les deux ;-)
Si tu dois charger des valeurs initiales appelle : ListBoxSort
Lorsque tu ajoutes un item par la suite appelle : LstAddItem

Quand penses tu Rey ?

@+

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
19 juin 2007 à 09:45
<strike>Quand</strike> Qu'en penses tu Rey ? (y en a d'autres mais je vais pas tout retaper)

@+

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 11:12
Ouais...
Je trouve que vous vous compliquez bien la vie, moi...

Une listbox avec sa propriété Sorted = True et :

Private Sub Form_Activate()
  mf1 = "yyyy/mm/dd"
  mf2 = "dd/mm/yyyy"
  List1.AddItem Format("02/04/2005", mf1)
  List1.AddItem Format("03/05/2006", mf1)
  List1.AddItem Format("10/01/2002", mf1)
  List1.AddItem Format("30/03/2004", mf1)
  ReDim toto(List1.ListCount) As String
  comb = List1.ListCount - 1
  For i = 0 To comb
    List1.AddItem Format(List1.List(comb), mf2), i
    List1.RemoveItem comb + 1
  Next
End Sub

Etr voilà : classés par ordre décroissant et dans un format lisible
C'est tout !
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
19 juin 2007 à 12:08
en effet jmfmarques...mais comment tu ajoutes un item après coup ? de plus le format souhaité par nono était DD.MM.YYYY et la fonction format ne fonctionne pas dans ce cas (sauf si tu changes les paramètres régionaux biensûr)

;-)

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 12:17
Ajouter un item "après coup" ?
OK (s'il le faut) et en le "paçant" bien sur... et en faisant (bien sur également) une boucle, mais par comme la tienne (méthode de recherche dans un dictionnaire = moins de tests)
Reste à savoir si nono doit "ajouter après coup" : si oui, je fais celà cet après midi

Pour le format avec des . au lieu des / ?   : cet aprem également (ce ne devrait pas être un vrai problème !)

Reste qu'existe une autre méthode (plus subtile mais que je vais éviter, juste pour le plaisir de me "casser un peu la tête")
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 14:36
Hé bé !
J'ai failli oublier ma promesse (deviens vieux, moi !)

Voilà pour la première partie :

Private Sub Form_Activate()
   mf1 = "yyyy/mm/dd"
   mf2 = "dd.mm.yyyy"
   injectons = Array("02.04.2005", "03/05/2006", "12/06/2006", "10/01/2001", "30/03/2004")
   For i = 0 To UBound(injectons)
      List1.AddItem Format(Replace(injectons(i), ".", "-"), mf1)
   Next
   ReDim toto(List1.ListCount) As String
   comb = List1.ListCount - 1
   For i = 0 To comb
      List1.AddItem Format(List1.List(comb), mf2), i
      List1.RemoveItem comb + 1
   Next
End Sub

J'attends que nono nous dise si oui ou non il a à faire également des ajouts "après coup"... si oui, je mettrai en oeuvre la méthode de "recherche dans un dictionnaire" (20 lectures et pas 1000000  de lectures pour rechercher la bonne place parmi un million d'articles )
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 18:09
Hello,

Désolé, mais journée intense au travail et donc je n'ai pas le temps de me connecter régulièrement.
J'ai hate de tester vos propsoitions ce soir.

En réponse à cette question:

J'attends que nono nous dise si oui ou non il a à faire également des
ajouts "après coup"... si oui, je mettrai en oeuvre la méthode de
"recherche dans un dictionnaire" (20 lectures et pas 1000000  de lectures pour rechercher la bonne place parmi un million d'articles

Je vais aussi faire des rajouts après coup, puisqu'il pourra m'arriver de scanner des documents anté-daté
et donc je les renregistrerai à leur date d'édition (ex: document édité le 12/04/2007 enregistré dans ma listbox sous ce format 12.04.2007 nono, pour un docuiment scanné ce jour)

A tout à l'heure
nono
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 18:10
Hello,

Désolé, mais journée intense au travail et donc je n'ai pas le temps de me connecter régulièrement.
J'ai hate de tester vos propsoitions ce soir.

En réponse à cette question:

J'attends que nono nous dise si oui ou non il a à faire également des
ajouts "après coup"... si oui, je mettrai en oeuvre la méthode de
"recherche dans un dictionnaire" (20 lectures et pas 1000000  de lectures pour rechercher la bonne place parmi un million d'articles

Je vais aussi faire des rajouts après coup, puisqu'il pourra m'arriver de scanner des documents anté-daté
et donc je les renregistrerai à leur date d'édition (ex: document édité le 12/04/2007 enregistré dans ma listbox sous ce format 12.04.2007 nono, pour un docuiment scanné ce jour)

A tout à l'heure
nono
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 18:10
Hello,

Désolé, mais journée intense au travail et donc je n'ai pas le temps de me connecter régulièrement.
J'ai hate de tester vos propsoitions ce soir.

En réponse à cette question:

J'attends que nono nous dise si oui ou non il a à faire également des
ajouts "après coup"... si oui, je mettrai en oeuvre la méthode de
"recherche dans un dictionnaire" (20 lectures et pas 1000000  de lectures pour rechercher la bonne place parmi un million d'articles

Je vais aussi faire des rajouts après coup, puisqu'il pourra m'arriver de scanner des documents anté-daté
et donc je les renregistrerai à leur date d'édition (ex: document édité le 12/04/2007 enregistré dans ma listbox sous ce format 12.04.2007 nono, pour un docuiment scanné ce jour)

A tout à l'heure
nono
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 19:45
Bon...
Tu vas devoir te montrer un peu patient...
Je m'y mets dès mon retour du restaurant...
A +
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
19 juin 2007 à 20:06
en tout cas non avec ta question tu auras fait tu buzz ;-)

Comme quoi, une simple listbox peut occuper les esprits ;-)

Yomm

[yommvb@free.fr yommvb@free.fr]

Et que la source soit avec toi!!!!!
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 21:48
Bon appétit jmfmarques

Cela me laisse le temps d'étudier tout cela !!

nono
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 21:54
Bon...
De retour et pret à développer....
Juste une question :
Pour les ajouts v"après copup" : l'utilisateur saisit dans quoi ? (une textbox, je suppose) ?
Et surtout : il saisit sous quel format, exactement ?
J'attends ta réponse mais commence déjà à établir mon algo.
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
19 juin 2007 à 22:03
Déjà de retour !!

L'utilisateur répond à 2 questions par une inputbox :

 1ere question:  NomFichier = InputBox("Nom de la biologie scannée :", "Scanner une biologie")
2ème question :   datedocument = InputBox("Date de la biologie (ex: 21.12.2003) :", "Taper OK pour la date d'aujourd'hui : " & Date)

Par la suite je scanne. Le titre du document scanné apparait dans la listbox
NomFichierScanne = datedocument & " " & NomFichier
lstBiologie.AddItem NomFichierScanne

puis j'appelle ma fonction qui me permettra de charger mes titre dans la listbox lors de la réouverture de mon fichier
Call ListBoxResourceBioScann(lstBiologie, LA_EcrireBioScannee)
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
19 juin 2007 à 22:28
Bon.
Merci
J'ai de mon côté terminé mon algo "général". Il marche fort bien en bouclant très peu (méthode crecherche dico)
Juste une chose avant, maintenant, d"adapter à ton cas particulier :
Quand l'utilisateur dit( OK, la date du jour apparait-elle bien sous la forme (pour aujourd'hui) : 19.06.2007 ? (avec le point comme séparateur) ?


Le reste sera un jeu d'enfan,t, mais j'ai besoin de cette confirmation.


Dis-moi.


 


Par ailleurs : quelle précaution as-tu prise pour rejeter une date incohérente ?
0