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

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:38
En fait cela n'a pas d'importance puisque je retravaille l'affichage de la date avec ce code (ci-dessous) de façon à ce qu'elle s'affiche avec des points.

Dim datedocument As String
datedébut:
  datedocument = InputBox("Date de la biologie (ex: 21.12.2003) :", "Taper OK pour la date d'aujourd'hui : " & Date)
  If datedocument = "" Then
    datedocument = Date
  End If
  DoEvents
 
  Dim DateTemporaire
    datedocument = Trim(datedocument)
    If Len(datedocument) <> 10 Then GoTo datedébut  '10 caractères
    Dim ChiffreGaucheDate As String, ChiffreCentreDate As String, ChiffreDroitDate As String
    ChiffreGaucheDate = Left(datedocument, 2)
    If IsNumeric(ChiffreGaucheDate) = False Or Val(ChiffreGaucheDate) > 31 Then GoTo datedébut
    ChiffreCentreDate = Mid(datedocument, 4, 2)
    If IsNumeric(ChiffreCentreDate) = False Or Val(ChiffreCentreDate) > 12 Then GoTo datedébut
    ChiffreDroitDate = Right(datedocument, 4)
    If IsNumeric(ChiffreDroitDate) = False Then GoTo datedébut
   
   ' DateTemporaire = ChiffreGaucheDate & "." & ChiffreCentreDate & "." & ChiffreDroitDate
    DateTemporaire = ChiffreDroitDate & "." & ChiffreCentreDate & "." & ChiffreGaucheDate

  datedocument = DateTemporaire
  DoEvents
 
           NomFichierScanne = datedocument & " " & NomFichier
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 00:05
Les 2 codes (ci-dessous) que tu m'as proposé fonctionne parfaitement bien avec sorted = true sur un nouveau projet.

Par contre lorsque je l'intégre dans mon prog, je me rend compte que le
titre de ma listbox comporte une date + un nom intégré dans un variable.
Si j'extrais la date avec la fonction left, comment puis-je l'associer
au nom lors du reclassment ?
Ce code ne suffit-il pas pour les ajouts ? A  moins que le reclassement prenne du temps à la longue s'il y a bcp de titres (retrnasfromer en format yyyy.mm.dd puis clmassmetnpar sorted puis retransformer en format dd.mm.yyyy) ?


Private Sub Form_Activate()

   mf1 = "yyyy/mm/dd"

   mf2 = "dd.mm.yyyy"

   injectons = Array("2005.04.02", "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


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
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 00:09
Bon je vais au lit.

Je pnese que tu es aller te coucher, cela fait plus d'1h que tu as laissé ton derrnier message.

A demzain et merci
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 00:30
Houla Houla !
Comment comment ?
Machine arrière toute, dans ce cas, ...
Explique bien :
Tu as besoin de trier par dates décroissantes mais tu as également besoin d'associer la date au nom de la personne ?

Si c'est çà, nono, je crois bien :
1) qu'on a tous travaillé pour rien, bien que rien ne soit jamais perdu (bien au contraire) pour tous, à commencer par moi qui ai mis au point un joli petit algo qui me servira ailleurs.
2) que tu devras changer de contrôle et utiliser une listview (ce qui te permettra de faire le tri sur les dates en entraînant dans la foulée les noms (et donc de garder le lien Nom/date).
Du coup, ce sera même plus facile qu'avec une listbox qui, elle, n'a qu'une colonne et ne peut donc faire la même gymnastique.

Bon...
Dis-moi .... et je te répondrai demain matin
Ce que je souhaite savoir est ceci :

1) nom de la variable du nom
2) nom de la variable de la date
ces 2 variables sont forcément séparées, me semble-til, dès lors que tu m'as dit plus haut utiliser une inputbox.

Si tel n'est pas TOUJOURS le cas (articles déjà existants, par exemple) : dis-moi comment ils ont été enregistrés (leur aspect et format précis)

3) nous allons parler maintenant du résultat à afficher.
Imagine un tableau à 2 colonnes :

DATE                                                         NOM

Format désiré exact                                   longueur du nom le plus long

Voilà. Ne te lance pas dans de grandes explications qui ne me servitont pas vraiment, mais renseigne les 2 parties en rouge
Exemples pour les dates : JJ/MM/AAAA ou JJ.MM.AAAA ou AAAA/MM/JJ ou AAAA.MM.JJ etc....
Exemple pour la longueur du nomp le plus long : 27
0

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

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 09:05
Bonjour,

Moi, je suis prêt
çà fonctionne et l'utilisateur peut saisir da date comme il se souhaites parmi ces quatre choix (JJ/MM/AAAA, JJ MM AAAA,  JJ-MM-AAAA ou JJ.MM.AAAA), à sa guise
(j'ai créé pour çà une varaiable sep = "je m'en fous"

Le tri se fait bien, dans l'ordre décroissant et les noms restent bien associés.

Me manquent plus que tes réponses.
De retour dans 2 heures...
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 09:16
Bopnjour jmf

Désolé pour le reatard de mes réponses, mais journées intenses cette semaine.
En ré"ponse à tes questions:

Format désiré exact: dd.mm.yyyy (avec des points)
ongueur du nom le plus long: 100 caracteres je pense

Le titre du document scanné "NomFichierScanne" dans ma listbox assoice la date et le nom (réponses aux inputbox) -- > cf plus haut
Ex:
NomFichierScanne = datedocument & " " & NomFichier
datedocument ="19.06.2007"  --> réponse à la seconde inputbox
NomFichier = Nono est content  --> réponse à la premiere inputbox
soit
NomFichierScanne = 19.06.2007 Nono est content

A tout à l(haure jmf
Merci
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 10:39
J'ai oublié de répondre à cette question: Si tel n'est pas TOUJOURS le cas (articles déjà existants, par exemple) : dis-moi comment ils ont été enregistrés (leur aspect et format précis)

lorsque les aritcles ont déjà été scannés, ils sont enregistrés dans un dossier et dans la listbox avec cette variable NomFichierScanne
Et donc quand je clique sur la listbox, j'utilise shell ... pour ouvrir l'article (enregistré dans un dossier avec ce nom) pour le visualiser.

je ne sais pas si je suis clair ....

Une listview ? Interessant ce que tu me dis là. Je ne connais pas encore très bien ce control.

 
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 11:29
Alors :
1) Projet ===>>> composants ====>> parcourir ====>> choix de COMCTL32.OCX ===>> insérer ===>>> plusieurs composant s'affichent alors dans ta fenêtre des composants ===>>> insére alors le composant ListView et laisse le nom ListView1 qui va lui être donné par défaut

Etire ta listview aux dimensions qui te paraissent agréeables

Code

Ajoute un bouton command1 et 2 textboxes Text1 et Text2
Text1 et text2 sont à utiliser, dans cet ordre : text1 pour saisir la date, Text2 pour saisir le nom
Tu génères ainsi la variable monchamp = Text1 & " " & Text2
Il est clair que monchamp pourrait également provenir de ce que tu veux d'autre, y compris d'une base de données.
Le principe reste le même : tu as à exploiter et à ajouter une variable monchamp = "jj.mm.aaaa unnom"


En cliquant sur command1, tu insères


Fais plusieurs insertions et observe :


1) j'ai permis (comme exposé au dessus, une liberté de choix de séparateur pour la date)


2) si l'utilisateur n'a pas saisi une date cohérente... tu vas le voir  et ça va beeper.
   Idem d'ailleurs si la donnée venant d'une autre source ne contient pas de date cohérente
3) tes dates sont classées de la dernière à la plus ancienne.

Voilà le code :

Private Sub Command1_Click()
     Dim monchamp As String
     mon_nom = Text1.Text
     ma_date = Text2.Text
     monchamp = Text1.Text & " " & Text2.Text
     ajout_dans_list monchamp, ListView1
End Sub


Private Sub Form_Activate()
    ListView1.View = lvwReport
    Set Font = ListView1.Font
    largeur1 = TextWidth("??? jj/mm/aaaa ???")
    largeur2 = TextWidth(String(100, "A"))
    ListView1.ColumnHeaders.Add , , "DATES", largeur1
    ListView1.ColumnHeaders.Add , , "NOMS", largeur2, lvwColumnLeft
    ListView1.ColumnHeaders.Add , , "", 0
    ListView1.SortOrder = lvwDescending
    ListView1.SortKey = 2
    ListView1.Sorted = True
End Sub




Private Sub ajout_dans_list(letexte As String, ctrl As ListView)
  tremplin = letexte
  la_date = Left(letexte, InStr(letexte, " ") - 1)
  le_nom = Trim(Mid(letexte, InStr(letexte, " ") + 1))
  tremplin = la_date
  sep = "je m'en fous"
  If tremplin Like "## ## ####" Then sep = " "
  If tremplin Like "##.##.####" Then sep = "."
  If InStr(tremplin, sep) > 0 Then
    tremplin = Replace(tremplin, sep, "-")
  End If
  If Not IsDate(tremplin) Or Len(tremplin) < 10 Then
     Beep     tremplin "9999999999": la_date "???" & la_date & "??"
  End If
  Dim itmX As ListItem
  Set itmX = ctrl.ListItems.Add(, , la_date)
  itmX.SubItems(1) = le_nom
  itmX.SubItems(2) = tremplin
End Sub

Dis-moi....
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 12:42
Je test le code sur un nouveau projet.
J'ai un run time error 13 type mismatrch sur
"ajout_dans_list monchamp, ListView1"

sais-tu pourquoi ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 15:49
Non !
Absolument pas !
Je viens de faire (sur un nouveau projet) les mêmes gestes que toi et n'ai aucune erreur !
Questions, donc :

1) as-tu bien inséré une cintrôle listview nommée Listview1 ?
2) quelle est ta version de VB ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 15:54
J'y pense :
tu as mon email.
Envoie-moi en pièce jointe ce nouveau projet qui ne marche pas chez toi
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 16:31
Tiens !
une petite vérification télécommandée :

Ajoute un bouton command2 dans ton npouveau projet qui génère l'erreur 13,

avec ce code

Private Sub Command2_Click()
  For Each ctrl In Controls
      bon = "non"
      If TypeOf ctrl Is ListView Then bon = "oui": Exit For
    Next
    MsgBox bon & "  " & ctrl.Name
End Sub

Lance, appuie uniquement sur command2 et dis-moi ce qui s'affiche, pour y voir clair.
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 16:40
j'ai VB6

l'erreur est variable not dfefined pour le ctrl dans
 For Each ctrl In Controls

si j'appuie sur le bouton de commande 2
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 16:59
çà c'est parce que tu as un Option Excplicit (tout en haut)

recommence avec ceci, alors

Private Sub Command2_Click()
  Dim ctrl As Control, bon As String
  For Each ctrl In Controls
      bon = "non"
      If TypeOf ctrl Is ListView Then bon = "oui": Exit For
    Next
    MsgBox bon & "  " & ctrl.Name
End Sub

Et c'est peut-être de là que venait l'erreur 13, au fait (définis toutes les variables dans mon code)
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 17:17
j'ai laissé option explicit et ai remplacé le code du bouton de commande 2 par ce nouveau code. J'ai une nouvelle erreur

"run time erreur 91
object varable or vith bloc variable not set "
et le focus est sur:
MsgBox bon & "  " & ctrl.Name

Ave cle bouton de commande 1 toujours l'erreur 13

Tu veux toujours que je t'envoie mon code sur ta boite mail ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 17:28
Oui, envoie...

Mais je vois déjà ce que c'est !!!
Tu n'as pas inséré le contrôle ListView !!!
Alors c'est sur, rien ne peut marcher s'il n'est pâs là !!!

Envoie et je te le renvoie corrigé.
0
nono78220 Messages postés 181 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 28 octobre 2010
20 juin 2007 à 19:54
je rentre chez moi
je revois cela
je te tiens au courant
je t'ai envoyé  le code sur MP
je te l'adresse  sur ta boite mail

A tout à l'heure dans 2 heures ....
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 juin 2007 à 22:30
Bon,

Nous nous sommes parlé au téléphone et finalement tout est résolu.
Il s'agissait apparemment d'un problème sur un PC et pas sur l'autre (un ocx pollué sur l'un des 2, apparemment).
Mais notre conversation m'a permis de découvir un petit problème idiot, maintenant réparé !
Dans mon élan pour installer un garde-fou/dates incohérentes, j'ai écrasé une ligne essentielle...

Voilà donc la version finale, en incluant l'option Explicit.
En rouge, ce qui avait été "écrasé" par erreur.

Option Explicit
Private Sub Command1_Click()
     Dim monchamp As String, mon_nom As String, ma_date As String
     mon_nom = Text1.Text
     ma_date = Text2.Text
     monchamp = Text1.Text & " " & Text2.Text
     ajout_dans_list monchamp, ListView1
End Sub


Private Sub Form_Activate()
Dim largeur1 As Long, largeur2 As Long
    ListView1.View = lvwReport
    Set Font = ListView1.Font
    largeur1 = TextWidth("??? jj/mm/aaaa ???")
    largeur2 = TextWidth(String(100, "A"))
    ListView1.ColumnHeaders.Add , , "DATES", largeur1
    ListView1.ColumnHeaders.Add , , "NOMS", largeur2, lvwColumnLeft
    ListView1.ColumnHeaders.Add , , "", 0
    ListView1.SortOrder = lvwDescending
    ListView1.SortKey = 2
    ListView1.Sorted = True
End Sub


Private Sub ajout_dans_list(letexte As String, ctrl As ListView)
  Dim tremplin As String, la_date As String, le_nom As String, sep As String
  tremplin = letexte
  la_date = Left(letexte, InStr(letexte, " ") - 1)
  le_nom = Trim(Mid(letexte, InStr(letexte, " ") + 1))
  tremplin = la_date
  sep = "je m'en fous"
  If tremplin Like "## ## ####" Then sep = " "
  If tremplin Like "##.##.####" Then sep = "."
  If InStr(tremplin, sep) > 0 Then
    tremplin = Replace(tremplin, sep, "-")
  End If
  If Not IsDate(tremplin) Or Len(tremplin) < 10 Then
     Beep     tremplin "9999999999": la_date "???" & la_date & "??"
  Else
     tremplin = Format(tremplin, "yyyymmdd")
  End If
  Dim itmX As ListItem
  Set itmX = ctrl.ListItems.Add(, , la_date)
  itmX.SubItems(1) = le_nom
  itmX.SubItems(2) = tremplin
End Sub

Vous devinez bien pourquoi cette ligne est essentielle, n'est-ce pas ???
C'est elle qui permet, précisément, les bons placements.
0
petitcaro112 Messages postés 46 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 30 janvier 2009
10 mars 2008 à 14:58
Bonjour !

Sans vouloir revenir sur le sujet, moi j'ai tout simplement une listbox où il n'y a que des dates dedans au format JJ/MM/AAAA. Je souhaite simplement (puis-je me permettre d'employer ce terme vu le débat qu'il y a eu ici ???) classer ces dates (croissant ou décroissant ce n'est pas un problème).

Alors pour explication rapide :
- Au chargement de la Form, la listbox est remplie par des dates prises dans une base de donnée et elle est invisible
- J'aimerai ensuite que les dates soient classées (croissant ou décroissant peu importe) dans la listbox
- Une fois les dates triées, la listbox devient visible.

Quelqu'un peut me donner des explications pour le classement (algo ou code) ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 mars 2008 à 15:02
vu que tes dates sont issues d'une base de données, demande un tri dans ta requete...

sSQL = "SELECT `maDate` FROM `maTable` ORDER BY `maDate` ASC"
...
0
Rejoignez-nous