Demande d'info sur la, propriété "SORTED" d'une listbox
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 octobre 2010
-
18 juin 2007 à 23:13
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 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
A voir également:
Demande d'info sur la, propriété "SORTED" d'une listbox
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 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
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 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) ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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...
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 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
nono78220
Messages postés181Date d'inscriptiondimanche 3 décembre 2006StatutMembreDernière intervention28 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
petitcaro112
Messages postés46Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention30 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) ?