galford999
Messages postés6Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention15 décembre 2006
-
14 déc. 2006 à 20:18
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 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
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
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.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
galford999
Messages postés6Date d'inscriptionmercredi 8 mars 2006StatutMembreDernière intervention15 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"
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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...
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
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
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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...