SAXODM
Messages postés2Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention20 octobre 2005 24 janv. 2005 à 11:01
Merci pour ce code qui n'a pas besoin d'interface (ListBox)
J'ai ajouté une amélioration qui ne manque pas d'intérêt de par sa simplicité
Voici la fonction intégrée dans un de mes programmes (d'où les changement de noms):
Public Function Tri_ALPHA(Tab_String() As String, Ascendant As Boolean) As Boolean
Dim l() As String
Dim s1 As String, s2 As String
Dim a As Long, id As Long, c As Long, d As Long
Dim Condition As Boolean
On Error GoTo err_quit
ReDim l(0)
l(0) = Tab_String(0)
For a = 1 To UBound(Tab_String(), 1)
id = 0
c = 1
Do While id <= UBound(l(), 1)
s1 = LCase(Mid(Trim(Tab_String(a)), c, 1))
s2 = LCase(Mid(Trim(l(id)), c, 1))
If Ascendant Then
Condition = (s1 < s2)
Else
Condition = (s1 > s2)
End If
If Condition Then
Exit Do
ElseIf s1 = s2 Then
c = c + 1
If c > Len(Trim(Tab_String(a))) + 1 Or c > Len(Trim(l(id))) + 1 Then
Exit Do
End If
Else
c = 1
id = id + 1
End If
Loop
ReDim Preserve l(a)
For d = UBound(l(), 1) To id + 1 Step -1
l(d) = l(d - 1)
Next d
l(id) = Tab_String(a)
Next a
Tab_String() = l()
Tri_ALPHA = True
Exit Function
err_quit:
Tri_ALPHA = False
End Function
bubble44
Messages postés200Date d'inscriptionlundi 10 mars 2003StatutMembreDernière intervention 3 août 2004 14 oct. 2003 à 15:26
Finallement j'ai besoin aussi d'un truc par nombre et la listbox ne fait pas l'affaire, et c'est quand meme pas tres elegeant de prendre un objet windows pour faire des tris donc voici du 100 % code :
Public Sub BubbleSortAlpha(arr As Variant)
Dim first As Long
Dim last As Long
Dim i As Long
Dim noswap As Boolean
Dim v As Variant
first = LBound(arr)
last = UBound(arr)
last = last - 1
Do While first <= last
noswap = True
For i = first To last
If arr(i) > arr(i + 1) Then
v = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = v
noswap = False
End If
Next i
last = last - 1
If noswap Then Exit Do
Loop
End Sub
Public Sub BubbleSortNumber(arr As Variant)
Dim first As Long
Dim last As Long
Dim i As Long
Dim noswap As Boolean
Dim v As Variant
first = LBound(arr)
last = UBound(arr)
last = last - 1
Do While first <= last
noswap = True
For i = first To last
If CInt(arr(i)) > CInt(arr(i + 1)) Then ' peut planter si pas integer à blinder donc ...
v = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = v
noswap = False
End If
Next i
last = last - 1
If noswap Then Exit Do
Loop
End Sub
bubble44
Messages postés200Date d'inscriptionlundi 10 mars 2003StatutMembreDernière intervention 3 août 2004 14 oct. 2003 à 14:57
Oui, l'idee de OverBillion est géniale.
Dans votre listbox c'est la propriéte "Sorted" a mettre a true.
Et apparement cette option ne se met qu'en design time, c'est a dire que l'on ne peut pas la changer en cours de programme (list.sort = true, est pas autorisé donc).
voila ce rajout de précisions vous fera gagner qqs mn, je trouvais pas le "sort".
a+ les filles !
=)))))
OverBillion
Messages postés15Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention14 mars 2008 29 sept. 2003 à 17:52
ouais...c cool tout ces algo de tri..ca me rappelle le lycée...
mais bon VB est plus fort que ca
utilisez plutot les listes....
ben oui! tu fous par une boucle for tout un tabelau de chaine dans une liste..
genre
for x = 1 to NbrIndice
list additem(tablo(x))
next x
ET! :::: la liste doit avoir sa propriété "sort" à true
genre: list.sort = true
pis a la fin...vous récupérez les éléments de la liste en ordre indexé
pis cest trié.....
haha! ben plus facile non?
a+ les mec!
cs_BFR
Messages postés88Date d'inscriptionmardi 30 juillet 2002StatutMembreDernière intervention 1 mars 2008 2 juil. 2003 à 10:35
on peut toujours faire plus simple il s'agit du tri à bulle adapté en trie alphabétique je m'en sert pour trier les dossier il faut simplement remplir un tableau avec les éléments à trier .Il existe des algo de trie plus rapide mais cela suffit pour quelques dizaines d'élements
A++
'-Trier (à bulle)les dossiers d'un tableau dans l'ordre alphabétique
'-Déclarations
Dim lgFor1 As Long
Dim lgFor2 As Long
Dim lgMin As Long
Dim MemoTmp As String
'-Init:
lgMin = LBound(Tableau)
'-Parcourt l'ensemble des éléments du tableau
For lgFor1 = UBound(Tableau) - 1 To lgMin Step -1
'-Parcourt l'ensemble des éléments non triés du tableau
For lgFor2 = lgMin + 1 To lgFor1
'-Comparaison du code numérique du 1er caractère de la chaine
If Asc(Left$(Tableau(lgFor2 - 1), 1)) > Asc(Left$(Tableau(lgFor2), 1)) Then
'-Echange de place entre deux éléments
'-Mémorisation
MemoTmp = Tableau(lgFor2 - 1)
'-Echange
Tableau(lgFor2 - 1) = Tableau(lgFor2)
'-Affectation élement mémoriser
Tableau(lgFor2) = MemoTmp
End If
Next lgFor2
Next lgFor1
sylric
Messages postés91Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention22 août 2003 2 juil. 2003 à 10:22
ça marche pas terrible, ça retourne toujours faux
Et il y a d'autres erreurs,
quand tu fais
Dim s1, s2 As String
Dim a, id, c, d As Long
S2 est déclaré comme string et s1 comme Variant, de même, a, id, c sont des variant et d est long.
Pour faire bien :
Dim S1 As String, s2 As String
Dim a As String, id As String, c As String, d As String
Autre erreur, comment tu fais avec un tableau dont le premier indice n'est pas 0 ? Tu n'a pas le droit de le trié ?
24 janv. 2005 à 11:01
J'ai ajouté une amélioration qui ne manque pas d'intérêt de par sa simplicité
Voici la fonction intégrée dans un de mes programmes (d'où les changement de noms):
Public Function Tri_ALPHA(Tab_String() As String, Ascendant As Boolean) As Boolean
Dim l() As String
Dim s1 As String, s2 As String
Dim a As Long, id As Long, c As Long, d As Long
Dim Condition As Boolean
On Error GoTo err_quit
ReDim l(0)
l(0) = Tab_String(0)
For a = 1 To UBound(Tab_String(), 1)
id = 0
c = 1
Do While id <= UBound(l(), 1)
s1 = LCase(Mid(Trim(Tab_String(a)), c, 1))
s2 = LCase(Mid(Trim(l(id)), c, 1))
If Ascendant Then
Condition = (s1 < s2)
Else
Condition = (s1 > s2)
End If
If Condition Then
Exit Do
ElseIf s1 = s2 Then
c = c + 1
If c > Len(Trim(Tab_String(a))) + 1 Or c > Len(Trim(l(id))) + 1 Then
Exit Do
End If
Else
c = 1
id = id + 1
End If
Loop
ReDim Preserve l(a)
For d = UBound(l(), 1) To id + 1 Step -1
l(d) = l(d - 1)
Next d
l(id) = Tab_String(a)
Next a
Tab_String() = l()
Tri_ALPHA = True
Exit Function
err_quit:
Tri_ALPHA = False
End Function
14 oct. 2003 à 15:26
Option Explicit
Private Sub Command1_Click()
Dim aa(5) As String
aa(0) = "desintegrator"
aa(1) = "dunbar"
aa(2) = "fpoullet"
aa(3) = "fsalamo"
aa(4) = "apachus"
aa(5) = "bubble44"
Call BubbleSortAlpha(aa)
aa(0) = "0"
aa(1) = "1"
aa(2) = "4"
aa(3) = "11"
aa(4) = "2"
aa(5) = "10"
Call BubbleSortNumber(aa)
End Sub
Public Sub BubbleSortAlpha(arr As Variant)
Dim first As Long
Dim last As Long
Dim i As Long
Dim noswap As Boolean
Dim v As Variant
first = LBound(arr)
last = UBound(arr)
last = last - 1
Do While first <= last
noswap = True
For i = first To last
If arr(i) > arr(i + 1) Then
v = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = v
noswap = False
End If
Next i
last = last - 1
If noswap Then Exit Do
Loop
End Sub
Public Sub BubbleSortNumber(arr As Variant)
Dim first As Long
Dim last As Long
Dim i As Long
Dim noswap As Boolean
Dim v As Variant
first = LBound(arr)
last = UBound(arr)
last = last - 1
Do While first <= last
noswap = True
For i = first To last
If CInt(arr(i)) > CInt(arr(i + 1)) Then ' peut planter si pas integer à blinder donc ...
v = arr(i)
arr(i) = arr(i + 1)
arr(i + 1) = v
noswap = False
End If
Next i
last = last - 1
If noswap Then Exit Do
Loop
End Sub
14 oct. 2003 à 14:57
Dans votre listbox c'est la propriéte "Sorted" a mettre a true.
Et apparement cette option ne se met qu'en design time, c'est a dire que l'on ne peut pas la changer en cours de programme (list.sort = true, est pas autorisé donc).
Sinon la syntaxe de additem est :
List1.AddItem ("b")
List1.AddItem ("a")
List1.AddItem ("z")
List1.AddItem ("e")
List1.AddItem ("h")
List1.AddItem ("c")
voila ce rajout de précisions vous fera gagner qqs mn, je trouvais pas le "sort".
a+ les filles !
=)))))
29 sept. 2003 à 17:52
mais bon VB est plus fort que ca
utilisez plutot les listes....
ben oui! tu fous par une boucle for tout un tabelau de chaine dans une liste..
genre
for x = 1 to NbrIndice
list additem(tablo(x))
next x
ET! :::: la liste doit avoir sa propriété "sort" à true
genre: list.sort = true
pis a la fin...vous récupérez les éléments de la liste en ordre indexé
pis cest trié.....
haha! ben plus facile non?
a+ les mec!
2 juil. 2003 à 10:35
A++
'-Trier (à bulle)les dossiers d'un tableau dans l'ordre alphabétique
'-Déclarations
Dim lgFor1 As Long
Dim lgFor2 As Long
Dim lgMin As Long
Dim MemoTmp As String
'-Init:
lgMin = LBound(Tableau)
'-Parcourt l'ensemble des éléments du tableau
For lgFor1 = UBound(Tableau) - 1 To lgMin Step -1
'-Parcourt l'ensemble des éléments non triés du tableau
For lgFor2 = lgMin + 1 To lgFor1
'-Comparaison du code numérique du 1er caractère de la chaine
If Asc(Left$(Tableau(lgFor2 - 1), 1)) > Asc(Left$(Tableau(lgFor2), 1)) Then
'-Echange de place entre deux éléments
'-Mémorisation
MemoTmp = Tableau(lgFor2 - 1)
'-Echange
Tableau(lgFor2 - 1) = Tableau(lgFor2)
'-Affectation élement mémoriser
Tableau(lgFor2) = MemoTmp
End If
Next lgFor2
Next lgFor1
2 juil. 2003 à 10:22
Et il y a d'autres erreurs,
quand tu fais
Dim s1, s2 As String
Dim a, id, c, d As Long
S2 est déclaré comme string et s1 comme Variant, de même, a, id, c sont des variant et d est long.
Pour faire bien :
Dim S1 As String, s2 As String
Dim a As String, id As String, c As String, d As String
Autre erreur, comment tu fais avec un tableau dont le premier indice n'est pas 0 ? Tu n'a pas le droit de le trié ?
En attendant que ça marche...