1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| Public Function TriABulle(Série As String, Optional ChoixRésultat As String = "Croissant")
' Tri à bulle --->http://lwh.free.fr/pages/algo/tri/tri_bulle.htm
'1er paramètre
'-------------
'valeurs entre quotes et séparées par |, "PaillePeu ou pipe" = <alt> + 124
'les nombres décimaux avec virgule.
'le premier membre détermine le type de données (date, numérique ou texte)
'2ème paramètre :
'--------------
' "Croissant" (par défaut) la fonction renvoie la série dans l'ordre croissant
' "Décroissant" la fonction renvoie la série dans l'ordre décroissant
' "Max" la fonction renvoie le maximum dans la série
' "Min" la fonction renvoie le minimum dans la série
'ex d'appels : TriABulle("31/12/09|25/3/2003|1/1/07","Décroissant")
'----------- TriABulle("1000|4|5|3,1416") ---> ordre croissant
' TriABulle("abc|d|efg|h|a|bcd","Max")
' TriABulle("1000|abc|5|3,1416") conduit à une erreur
' TriABulle("31/12/09|A|1/1/07") conduit à une erreur
' TriABulle("a|abc|31/12/07|3,1416")sera accepté, _
mais les dates et nombres seront traités comme du texte
On Error GoTo erreur
Dim ArrSérie() As String, i As Integer, Permuté As Boolean, Tampon As Variant
ArrSérie = Split(Série, "|")
Permuté = True
If IsDate(ArrSérie(0)) Then 'comparaison de dates
'vérifier homogénéité
For i = 1 To UBound(ArrSérie)
If Not IsDate(ArrSérie(i)) Then GoTo erreur
Next i
'classer en ordre croissant par permutations successives
Do While Permuté = True
Permuté = False
For i = 0 To UBound(ArrSérie) - 1
If Format(ArrSérie(i), "yymmdd") > Format(ArrSérie(i + 1), "yymmdd") Then
Tampon = ArrSérie(i + 1)
ArrSérie(i + 1) = ArrSérie(i)
ArrSérie(i) = Tampon
Permuté = True
End If
Next i
Loop
ElseIf IsNumeric(ArrSérie(0)) Then 'comparaison de numériques
'vérifier homogénéité
For i = 1 To UBound(ArrSérie)
If Not IsNumeric(ArrSérie(i)) Then GoTo erreur
Next i
'classer en ordre croissant par permutations successives
Do While Permuté = True
Permuté = False
For i = 0 To UBound(ArrSérie) - 1
If CDbl(ArrSérie(i)) > CDbl(ArrSérie(i + 1)) Then
Tampon = ArrSérie(i + 1)
ArrSérie(i + 1) = ArrSérie(i)
ArrSérie(i) = Tampon
Permuté = True
End If
Next i
Loop
Else ' comparaison texte
Do While Permuté = True
Permuté = False
For i = 0 To UBound(ArrSérie) - 1
If ArrSérie(i) > ArrSérie(i + 1) Then
Tampon = ArrSérie(i + 1)
ArrSérie(i + 1) = ArrSérie(i)
ArrSérie(i) = Tampon
Permuté = True
End If
Next i
Loop
End If
AménagerRésultat:
Select Case ChoixRésultat
Case "Croissant"
For i = 0 To UBound(ArrSérie)
TriABulle = TriABulle & ArrSérie(i) & "|"
Next i
TriABulle = Left(TriABulle, Len(TriABulle) - 1)
Case "Décroissant"
For i = UBound(ArrSérie) To 0 Step -1
TriABulle = TriABulle & ArrSérie(i) & "|"
Next i
TriABulle = Left(TriABulle, Len(TriABulle) - 1)
Case "Max"
TriABulle = ArrSérie(UBound(ArrSérie))
Case "Min"
TriABulle = ArrSérie(0)
Case Else
MsgBox "Ce paramètre de choix n'est pas prévu", vbCritical
Exit Function
End Select
Exit Function
erreur:
MsgBox "les données ne sont pas homogènes", vbCritical
End Function |
Partager