Odesta
XLDnaute Impliqué
Bonjour à tous et à toutes
Je me permets d'ouvrir un post (c'est pas souvent) pour vous faire partager cette petite macro que je me copie de programme en programme, réalisée il y a quelques mois, et commentée exprès pour ceux qui s'y intéresseront.
Et aussi pour montrer mon 'implication' à XLD.
Cette macro réalise le tri d'un tableau, qui comporte une ou deux dimensions, par ordre croissant ou non.
+ un mini fichier pour tester rapidement
Bien cordialement
Olivier
EDIT PJ repostée avec un exemple de plus
Je me permets d'ouvrir un post (c'est pas souvent) pour vous faire partager cette petite macro que je me copie de programme en programme, réalisée il y a quelques mois, et commentée exprès pour ceux qui s'y intéresseront.
Et aussi pour montrer mon 'implication' à XLD.
Cette macro réalise le tri d'un tableau, qui comporte une ou deux dimensions, par ordre croissant ou non.
VB:
Sub trier_tableau(ByRef tableau As Variant, Optional ByRef colonne As Integer = -1, Optional ByRef croissant As Boolean = True)
'cette macro sert à trier un tableau déclaré comme public
'les tableaux peuvent comporter, ou non, une deuxième dimension
' en cas de deuxième dimension, la variable colonne correspond à la colonne que l'on souhaite trier
' dans le cas où le tableau ne comporte qu'une dimension, ne pas indiquer de valeur dans colonne
' (la valeur 0 ou 1 indique la première colonne d'un tableau à deux dimensions, pensez à vérifier quelle valeur renvoie LBOUND)
'la macro permet aussi de trier par ordre croissant ou décroissant (par la valeur Optionnelle Vrai ou Faux)
If Not colonne = -1 Then 'lorsque le tableau comporte une deuxième dimension
'trier un tableau suivant une colonne choisie pour toutes les lignes dans l'ordre croissant ou décroissant
ligne = LBound(tableau, 1)
While ligne < UBound(tableau, 1)
If (croissant And (tableau(ligne, colonne) > tableau(ligne + 1, colonne))) Or (Not croissant And (tableau(ligne, colonne) < tableau(ligne + 1, colonne))) Then
For col = LBound(tableau, 2) To UBound(tableau, 2)
temp = tableau(ligne, col)
tableau(ligne, col) = tableau(ligne + 1, col)
tableau(ligne + 1, col) = temp
Next col
ligne = LBound(tableau, 1)
Else
ligne = ligne + 1
End If
Wend
Else
ligne = LBound(tableau, 1)
While ligne < UBound(tableau, 1)
If (croissant And (tableau(ligne) > tableau(ligne + 1))) Or (Not croissant And (tableau(ligne) < tableau(ligne + 1))) Then
temp = tableau(ligne)
tableau(ligne) = tableau(ligne + 1)
tableau(ligne + 1) = temp
ligne = LBound(tableau, 1)
Else
ligne = ligne + 1
End If
Wend
End If
End Sub
+ un mini fichier pour tester rapidement
Bien cordialement
Olivier
EDIT PJ repostée avec un exemple de plus
Pièces jointes
Dernière édition: