Compter le nombres de lignes identiques dans un listbox?

Résolu
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012 - 15 janv. 2010 à 18:58
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012 - 16 janv. 2010 à 19:52
Bonsoir à tous,

J'ai un problème à résoudre mais je ne sais pas comment faire ou si c'est possible ?

Comment compter le nombres de lignes identiques dans un listbox, je m?explique ?


J'ai un LISTBOX1 avec des mots comme ci dessous :


Listbox 1

Machine
Machine
Truc
Truc
Bidule
bidule
Avant



et j'aimerais pouvoir compter les mots identiques dans un autre LISTBOX2 et afficher la quantité en chiffre comme ci dessous.



Listbox 2

Machine 2
Truc 2
Bidule 2
Avant 1

Pensez-vous que c'est possible et si oui comment faire?


Merci bien

17 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 16:18
Et permets-mpoi d'ajouter que s'il était possible de gérer distinctement deux colonnes d'une listbox sous VB6, mon code eût été complètement différent ! et celui de Clayiah n'aurait pas eu besoin de Instr !
Une autre fois : VB6 n'est pas VBA et les listboxes de l'un ne sont pas celles de l'autre ...
Celles de VBA peuvent avoir plusieurs colonnes réelles (pas de disposition d'affichage uniquement). pas celles de VB5
Celles de VB6 possèdent par' contre une propriété Sorted que ne possèdent pas celles de VBA

Voilà !

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 janv. 2010 à 20:42
Bonjour,
Confirme que tu travailles bienjh avec VB6 et non avec VBA !
Attention : ta réponse est très importante car le traitement est différent dans un cas et dans l'autre (facile sous VB6, un peu plus complexe sous VBA).
Pourquoi cette demande de précision ? parce que tu as posté sous VB6, mais que certaine "noms de baptème" donnent à penser que tel n'est peut-être pas le cas ...


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 janv. 2010 à 20:45
Oh ! Attends un peu, là ...
Qu'as-tu donc fait et que comptes-tu faire vde cette discussion, laissée sans suite, sur le même thème ?
http://www.vbfrance.com/forum/sujet-COMPTER-NOMBRE-MOTS-IDENTIQUES-DANS-LISTBOX_1381305.aspx?p=2
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
15 janv. 2010 à 23:28
Bonsoir,

Merci pour ta réponse.

Oui effectivement c'est une question que j'avais posée il y a un mois avec comme finalité de m?intéresser à d'autre type de contrôleur( Réponse acceptée à jmf0 )

Mais j'aimerais trouver la solution avec un listbox.

Si tu peux m?apporter ton aide ça sera avec plaisir.


je confirme que mon travailles est bien avec VB6.


Merci par avance.
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 00:18
Si tu est sous VB6, une listbox est dotée de la propriété sorted.
Mets-la à True pour la List1 avant de la remplir

puis (bâclé car j'ai sommeil, mais fonctionne bien évidemment )

Dim nb As Integer, bout As Integer, i As Integer
  bout = List1.ListCount - 1
  toto = List1.List(bout)
  For i = 0 To bout
    toto = List1.List(i)
    nb = 1
    If i < bout - 1 Then
      Do While List1.List(i + 1) = toto
        nb = nb + 1
        i = i + 1
      Loop
    End If
    List2.AddItem toto & "  " & nb
  Next


C'est bâclé ... à toi de mettre cela en "plus mieux"
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 00:23
Corrige !
ce n'est pas
if i < bout -1
mais
if i < bout


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 00:31
GAFFE ! Bug découvert en testant mon code !

corrige :

Dim nb As Integer, bout As Integer, i As Integer
  bout = List1.ListCount - 1
  toto = List1.List(bout)
  For i = 0 To bout
    toto = List1.List(i)
    nb = 1
    If i < bout Then
      Do While List1.List(i + 1) = toto
        nb = nb + 1
        i = i + 1
        If i = bout Then Exit Do
      Loop
    End If
    List2.AddItem toto & "  " & nb
  Next


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 janv. 2010 à 01:13
ton code est incorrect je crois


Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 janv. 2010 à 01:46
Dim i As Long, k As Long, sel As String, numb As Long, dej As String
k = 0
While k <= List1.ListCount - 1
'element qu'on va controlé
sel = List1.List(k)
'nombre de répétion
numb = 0
'vérifier si on a déja controlé cet item ou pas
If Not (InStr(1, dej, Chr(9) & sel) >= 1) Then
'sinon on le controle
For i = 0 To List1.ListCount - 1
If List1.List(i) = sel Then
numb = numb + 1
dej = dej & Chr(9) & sel
End If
Next
List2.AddItem sel & " " & numb
End If
k = k + 1
DoEvents
Wend


Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 09:02
As-tu essayé mon code, claiyah ?
Moi, je viens de le faire !
Fonctionne impec (tu as dû oublier de mettre à Trèue la propriété Sorted de List1 avant de la remplir !)


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 09:40
Voilà en tout état de cause comment tu devrais modifier tyon code (pour list1 non sorted) si tu veux éviter de reprendre inutilement ta boucle i au début à chaque fois !
Et ta variable dej ne sert alors à rien et on la supprime...
k = 0
While k <= List1.ListCount - 1
  sel = List1.List(k)
  numb = 1
  For i = k + 1 To List1.ListCount - 1
    If List1.List(i) = sel Then
      numb = numb + 1
      k = k + 1
    End If
  Next
  List2.AddItem sel & " " & numb
  k = k + 1
Wend


Maintenant : pourquoi est-il préférable de partir d'une List1 avec propriété sorted à True et avec mon code ?
Tout simplement parce que l'on évite ainsi, précisément, toutes les boucles "à la recherche" d'un "également présent" éventuel (ce qui trisque de devenir très pénalisant sur longue liste !)

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 12:04
Désolé (bug si pas trié)...


Récapitulons (vaut mieux) :
1) si trié ; mon code précédent est rapide :
Dim nb As Integer, bout As Integer, i As Integer
  bout = List1.ListCount - 1
  toto = List1.List(bout)
  For i = 0 To bout
    toto = List1.List(i)
    nb = 1
    If i < bout Then
      Do While List1.List(i + 1) = toto
        nb = nb + 1
        i = i + 1
        If i = bout Then Exit Do
      Loop
    End If
    List2.AddItem toto & "  " & nb
  Next


Si pas trié, mais que l'on veut éviter de reprendre la boucle en arrière à chaque fois et enj plus utiliuser instr, voilà une méthode plus rapide, notamment si longue liste :
Dim i As Long, k As Long, quoi As String, bout As Long, nb As Long, toto() As String
 bout = List1.ListCount - 1
  ReDim toto(bout) As String
  For i = 0 To bout
    toto(i) = List1.List(i)
  Next
  For i = 0 To UBound(toto)
    quoi = toto(i)
    toto(i) = Chr(0)
    nb = 1
    If quoi <> Chr(0) Then
      For k = i + 1 To UBound(toto)
        If toto(k) = quoi Then
          nb = nb + 1
          toto(k) = Chr(0)
        End If
     Next
     List2.AddItem quoi & "  " & nb
   End If
  Next



____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
16 janv. 2010 à 15:23
Bonjour à toi ucfoutu,

je viens de tester ton code il fonctionne impec

[i]Dim nb As Integer, bout As Integer, i As Integer
bout = List1.ListCount - 1
toto = List1.List(bout)
For i = 0 To bout
toto = List1.List(i)
nb = 1
If i < bout Then
Do While List1.List(i + 1) = toto
nb = nb + 1
i = i + 1
If i = bout Then Exit Do
Loop
End If
List2.AddItem toto & " " & nb
Next/i




Par contre, est-il possible de faire afficher le chiffre toujours dans la list2 mais dans une colonne différente.Le noms dans le additem de la list2 et sa quantité dans la colonne 2 de la list2 aussi.

Ex :

Listbox 1

Machine
Machine
Truc
Truc
Bidule
bidule
Avant

Listbox 2
Colonne additem colonne2

Machine 2
Truc 2
Bidule 2
Avant 1


Un grand merci d'avance.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 16:06
Par contre, est-il possible de faire afficher le chiffre toujours dans la list2 mais dans une colonne différente.Le noms dans le additem de la list2 et sa quantité dans la colonne 2 de la list2 aussi. 

Ah000
Comme te l'a expliqué mon copain jmf0 dans une autre discussion, les listboxes de VB6 ne gèrent réellement qu'une seule colonne réelle, bien que l'affichage apparent puisse laisser penser qu'elles sont deux !
Ainsi : oui, il serait possible d'afficher sur deux "fausses colonnes", mais à quoi cela servirait-il, puisque qu'il ne s'agirait là que d'une disposition en affichage et que tu ne pourrais pas distinguer réellement (et gérer) la seconde et la première (en, pointant des index différents)!
Sous VB6, si tu veux imiter ce qu'est capable de faire VBA (deux colonnes réelles, que tu peux réellement gérer et lire distinctement), tu n'as pas d'autre choix (relire jmf0) que celui d'utiliser un autre contrôle qu'une listbox ! (une listview, par exemple).
Mais tout cela t'a déjà été dit, non ? ... et- ucfoutu n'a rien d'autrre à exprimer à ce sujet que ce qu'a exprimé jmf0

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
16 janv. 2010 à 19:16
Merci à toi ucfoutu,

Un grand merci à toi pour ton travail sur ce code qui fonctionne bien et qui me sera utile.

Une bonne soirée à toi.
0
Claiyah Messages postés 580 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 20 avril 2010 3
16 janv. 2010 à 19:29
merci a moi aussi


Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
16 janv. 2010 à 19:52
Oui merci à toi aussi Claiyah


Bonne soirée
0
Rejoignez-nous