Compter le nombres de lignes identiques dans un listbox? [Résolu]

sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 15 janv. 2010 à 18:58 - Dernière réponse : sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention
- 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
Afficher la suite 

17 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 16:18
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 janv. 2010 à 20:42
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 janv. 2010 à 20:45
0
Utile
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.
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 15 janv. 2010 à 23:28
0
Utile
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.
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 00:18
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 00:23
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 00:31
0
Utile
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.
Commenter la réponse de ucfoutu
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 janv. 2010 à 01:13
0
Utile
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
Commenter la réponse de Claiyah
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 janv. 2010 à 01:46
0
Utile
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
Commenter la réponse de Claiyah
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 09:02
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 09:40
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 12:04
0
Utile
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.
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 16 janv. 2010 à 15:23
0
Utile
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.
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 janv. 2010 à 16:06
0
Utile
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.
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 16 janv. 2010 à 19:16
0
Utile
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.
Commenter la réponse de sancho12345
Claiyah 580 Messages postés mercredi 20 août 2008Date d'inscription 20 avril 2010 Dernière intervention - 16 janv. 2010 à 19:29
0
Utile
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
Commenter la réponse de Claiyah
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 16 janv. 2010 à 19:52
0
Utile
Oui merci à toi aussi Claiyah


Bonne soirée
Commenter la réponse de sancho12345

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.