Petit probleme de manipulation de listbox!

galford999 Messages postés 6 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 décembre 2006 - 14 déc. 2006 à 20:18
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 - 21 déc. 2006 à 12:39
bonjour,
comme je suis debutant je souhaiterai savoir comment manipuler des listbox pour par exemple :
chercher une suite de nombres figurant sur une liste 1 dans une autre liste 2 et determiner le nombre d'apparitions
ex: chercher 1,5,8 dans  la suite
1,5,,12,1,5,8. donc ça fé 2 fois( j'arriv à le faire avec des textbox mais pas avec des listbox)
je precise que c'est pas un TP à rendre, mais juste que j'arrive pas à trouver l'astuce pour une partie de mon projet.
Merci

20 réponses

chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 déc. 2006 à 21:41
Bonsoir,
va pour "ce n' est pas un devoir", on te croit...


tu fais une fonction qui cherche ta suite dans une listbox


Function ChercheSuite(xSuite as String,xList As ListBox) As Integer
ChercheSuite=0
Dim lstCount As Integer
lstCount =xList.ListCount
'il faudra tester
If Len(xSuite)>lstCount Then Exit Function
Dim i As Integer


 lstCount =lstCount -1 'Pour adapter l' index qui commence à 0
 For i=0 To LstCount -2 '2 pour une suite de 3
      if List2.List(i) & " ,"  & List2.List(i+1) & " ,"  & _
          List2.List(i+2) =xSuite Then _
          ChercheSuite=ChercheSuite+1
      Next i


End Function
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
14 déc. 2006 à 22:23
Salut,

Pour réaliser ce que tu souhaites, il faut concaténer les valeurs dans tes listboxes.
Si ce sont des nombres entiers, tu peux les concaténer avec une virgule.

Public Function Concatene(List1 As ListBox) As String
Dim sTemp As String
Dim i As Long
sTemp=""
For i = 0 To List1.ListCount
   sTemp = sTemp & List1.List(i) & ","
Next i
Concatene = Left$(sTemp,Len(sTemp)-1)
End Function

Ensuite, tu manipules de simples chaines de caractères.

premiereChaine = Concatene(ListBox1)
deuxiemeChaine = Concatene(ListBox2)

Et avec les méthodes Instr() et Mid(), tu arriveras facilement au résultat voulu.

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 déc. 2006 à 23:03
Bonsoir econs,

Tout les chemins mènent à Rome,
mais le plus court c' est celui qui part de la périphérie ...


Pour généraliser et pour ne pas être limité à 3


Function ChercheSuite(xSuite As String,xList As ListBox) As Integer
 ChercheSuite=0
 Dim sLen As Integer
 Dim lstCount As Integer
 lstCount =xList.ListCount
'il faudra tester
 If sLen >lstCount Then Exit Function


 Dim i As Integer, j As Integer
 Dim sTemp As String


 For i=0 To LstCount - sLen
      sTemp=""
      For j= 1 To sLen
         sTemp=sTemp & "," xList.List(i+j)
      Next j
      if sTemp=xSuite Then ChercheSuite=ChercheSuite+1
  Next i
End Function

pour l' appel:

MonCompte=ChercheSuite("1,5,8",ListBox2)
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 déc. 2006 à 23:09
For j= 0 To sLen-1
0

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

Posez votre question
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
15 déc. 2006 à 07:02
chaibat> Moi je passe une seule fois sur chaque élément d'une listbox.
Toi tu passes N fois sur chaque élément, si N est la longueur du pattern recherché.
Sans compter que tu fais une boucle imbriquée, avec (LstCount-sLen+1)*sLen appels à xList.List().
Bref, quand les listes sont longues, tu rames ...

List1 : 3 éléments
List2 : 35 éléments

Manu : 38 appels à xList.List()
Chaibat : (35-3+1)*35 = 1155 appels à xList.List()

L'appel répété aux objets se fait vite sentir en terme de performance ...
Voilà pourquoi il ne faut pas se trainer ce genre d'appels dans des boucles interminables.

Parfois, un TGV Milan-Rome peut être plus rapide qu'une voiture dans les bouchons du périphérique romain.



Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
galford999 Messages postés 6 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 décembre 2006
15 déc. 2006 à 11:13
 ya t'il un moyen plus simple sans passer par les string!
ChercheSuite(xSuite As String,xList As ListBox) As Integer
exemple manipuler deux listes(list1, list2)  avec des entiers, le but c chercher le nombre d'apparition de list1 dans list2

 ex: public suitecherchée (1 to 10) as double........>>list1
       public suitede nombre(1 to 100) as double.....>> list2

prob j'arriv pas à l'implanter correctement la procedure ! à cause de "sLen"
Function ChercheSuite(xSuite As String,xList As ListBox) As Integer
 ChercheSuite=0
 Dim sLen As Integer
 Dim lstCount As Integer
 lstCount =xList.ListCount
'il faudra tester
 If sLen >lstCount Then Exit Function

 Dim i As Integer, j As Integer
 Dim sTemp As String

 For i=0 To LstCount - sLen
      sTemp=""
      For j= 1 To sLen
         sTemp=sTemp & "," xList.List(i+j)
      Next j
      if sTemp=xSuite Then ChercheSuite=ChercheSuite+1
  Next i
End Function

pour l' appel:

MonCompte=ChercheSuite("1,5,8",ListBox2)>>>>or il faut passer par list1 et pas "1,5,8"

@++
0
galford999 Messages postés 6 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 décembre 2006
15 déc. 2006 à 11:40
salut:
 le truc c que y a pas de virgules c juste un separateur en fait ç ressemblera à ça: exemple:

list1        list2
1              X
5              Y
8               Z
                 N
                  K
                  .
0
galford999 Messages postés 6 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 décembre 2006
15 déc. 2006 à 11:55
desolé prob de mise en page:
ex:
listbox1: 1 5 8
listbox2: 5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8 4356
nb apparition =3
@++
0
galford999 Messages postés 6 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 décembre 2006
15 déc. 2006 à 12:02
ou:
ex:  c pas une chaine horizontale c un classement vertical!!(list)
listbox1: 11  5  844
listbox2: 51   732   5   11  5  844   42   13   1   5   8   0   8  43  5  6  7  8  6  11  5  544   8   4356
nb apparition =2
@++
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
15 déc. 2006 à 14:40
Bonjour,

^^ "prob j'arriv pas à l'implanter correctement la procedure !
à cause de "sLen"
Effectivement il y a un hic !
dans mon exemple , j' ai omis de considérer le séparateur dans sLenLen(xSuite)>Len("1,5,8") = 5 et non 3
du coup il faudra reconsidérer l' appel en faisant passer la chaine
sans séparateur et concaténer aussi sans celui-ci...

ce qui répond à ta remarque:^^"le truc c que y a pas de virgules c juste
un separateur"

Function ChercheSuite(xSuite As String ,xList As ListBox) As Integer
 ChercheSuite =0
 Dim sLen As Integer
 Dim lstCount As Integer
 lstCount =xList.ListCount
'il faudra tester
 If sLen >lstCount Then Exit Function

 Dim i As Integer, j As Integer
 Dim sTemp As String

 For i=0 To LstCount - sLen
      sTemp=""
      For j= 0 To sLen-1
         sTemp=sTemp & xList.List(i+j)
      Next j
      if sTemp=xSuite Then ChercheSuite=ChercheSuite+1
  Next i
End Function

pour l' appel:

MonCompte=ChercheSuite("158",ListBox2
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
15 déc. 2006 à 15:00
@Manu,
et dans Instr() et (ou) Mid() , combien de passage ?
Tu as une idée comment sont faites ces fonctions ?
Toujours est-il que tu as sûrement raison à propos
des appels répététifs à des objets...

A Rome alors ..
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
15 déc. 2006 à 17:19
Un seul passage pour Instr() ou Mid(). Et d'ailleurs, pas besoin de Mid() pour ce qu'il veut faire.
Même si perso, j'aurai utilisé des expressions régulières. Mais bon, pas la peine de l'embrouiller avec tout çà.

Pour répondre à sa question "pourquoi passer par des chaines de caractères ?", c'est justement parce que leur manipulation est beaucoup plus rapide que celle des objets. Quite à être débutant, autant en profiter pour prendre de bonnes habitudes.

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
15 déc. 2006 à 20:09
...
ma question fût : dans Instr() et (ou) Mid() , combien de passage ?
et pas combien d' appel à Instr et (ou) à Mid() .
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
16 déc. 2006 à 10:09
Ma réponse est bien "une fois". Je ne parlais pas des appels.

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
16 déc. 2006 à 14:45
Non cher ami,
dans InStr() il y' a bien un traitement semblable à :





5 7 5

1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
5 7 5 1 5 8 4 2 1 1 5 8 0 8 43 5 6 7 8 6 1 5 8
...


etc.....

en tout cas,
lègère amélioration pour réduire considérablement
le nombre de passage...
Elle consistre à rechercher d' abord le premier élement
de la suite (le "1" dans l'exemple)


Function ChercheSuite(xSuite As String,xList As ListBox) As Integer
 ChercheSuite=0
 Dim sLen As Integer
 Dim lstCount As Integer
 lstCount =xList.ListCount
'il faudra tester
 If sLen >lstCount Then Exit Function
 
 Dim i As Integer, j As Integer
 Dim sTemp As String,sDebut As string


 sDebut =Mid(xSuite,1,1)
 sTemp=""
 For i=0 To LstCount - sLen
     If Mid(xList.List(i),1,1)=sDebut  Then
         For j= 0 To sLen-1
            sTemp=sTemp & xList.List(i+j)
         Next j
         if sTemp=xSuite Then ChercheSuite=ChercheSuite+1 
         sTemp=""
     End If
 Next i
End Function


 
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
17 déc. 2006 à 00:50
Ben non. Si le premier des trois (en exemple ici) caractères ne correspond pas, tu sautes au suivant sans tester les autres.
=> Un seul passage dans la majorité des cas.
D'ailleurs,
m'étonnerait que Instr() fasse des comparaisons de caractères un à un.
Je penche plutôt pour le passage d'un masque (commande logique 'And')

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
17 déc. 2006 à 18:53
Bonsoir Manu,

si tu cherches 158 dans 7 5 1 5 8 4 2 1
  7 <> 1 tu passes
  5 <> 1 tu passes
  1 = 1
      boucle
      passage sur 5  tu concatènes
      passage sur 8  tu concatènes  
      fin de boucle
     158=158 ==> occurence
   
  tu reprends tes passages
  5 <> 1 tu passes
  8 <> 1 tu passes
  4 <> 1 tu passes
  2 <> 1 tu passes
  1 = 1
    tu tentes la boucle
    fin de la liste
    tu quittes

a+
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
19 déc. 2006 à 23:20
Tu as donc, dans l'exemple ci-dessus :
7 5 1 . . 4 . . => 1 passage sur ces chiffres
. . . 5 8 . . . => 2 passages sur ces chiffres
. . . . . . 2 1 => 0 passage (car pas possible de trouver une chaine de longueur 3 sur les 2 derniers octets)

Tu fais donc 8 tests d'égalité sur une chaine de longueur 8.
Pour une opération de type Instr(), en moyenne, c'est un passage par caractère.

CQFD






Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
19 déc. 2006 à 23:53
Bonsoir Manu,


En fait dans l' exemple il y' a en tout 10 passages et non pas 8
Pour les 5 8 (qui suivent le 1) il y' a 2 fois deux passages
-une fois dans la boucle imbriquée avec le 1
-et une fois un passage (séparément) pour chacun,
puisque après 158=158 , ça repart sur le 5 puis sur le 8
Je sais que ce sont 2 de trop, mais c' est sûr qu' avec InStr()
c' est plus court...


Aller, sans rancune: t' as gagné !
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
21 déc. 2006 à 12:39
Exact !
pas de passage pour les deux derniers
à cause de (ou grace à)   :
For i=0 To LstCount - sLen
mais tu restes gagnant tout de même...
0
Rejoignez-nous