Astuce VBA : trier un Array

Voici une solution prête à l'emploi pour trier une variable tableau (Array) en VBA sans toucher aux cellules.

Cette solution est prévue pour un tableau à 1 dimension et un tri croissant (ordre alphabétique).

Une seconde solution pour trier un tableau à 1 dimension par ordre décroissant (ordre alphabétique inverse) est disponible un peu plus bas.


Tri croissant

Copiez tout d'abord cette procédure dans un module :

'Tri croissant (ordre alphabétique) d'un tableau à 1 dimension
'Source : https://www.excel-pratique.com/fr/astuces_vba/trier-tableau-array
Sub triCroissant(tableau)
    nb = UBound(tableau)
    tabTemp = tableau
    Erase tableau
    For i = 0 To nb
        pos = 0
        For l = 0 To nb
            If LCase(tabTemp(i)) > LCase(tabTemp(l)) And i <> l Then
                pos = pos + 1
            End If
        Next
        For ii = 1 To 1
            If tableau(pos) = "" Then
                tableau(pos) = tabTemp(i)
            Else
                pos = pos + 1
                ii = ii - 1
            End If
        Next
    Next
End Sub

Ajoutez ensuite simplement la ligne triCroissant tableau pour trier votre tableau :

Sub exemple()
    
    Dim tableau(29)
    
    'Pour exemple : copie de A1 à A30 dans un tableau
    For i = 1 To 30
        tableau(i - 1) = Range("A" & i)
    Next

    'Tri du tableau
    triCroissant tableau
    
    'Pour exemple : copie du tableau trié dans la colonne B
    For i = 1 To 30
        Range("B" & i) = tableau(i - 1)
    Next

End Sub

Tri décroissant

Copiez cette procédure dans un module :

'Tri décroissant (ordre alphabétique) d'un tableau à 1 dimension
'Source : https://www.excel-pratique.com/fr/astuces_vba/trier-tableau-array
Sub triDecroissant(tableau)
    nb = UBound(tableau)
    tabTemp = tableau
    Erase tableau
    For i = 0 To nb
        pos = 0
        For l = 0 To nb
            If LCase(tabTemp(i)) > LCase(tabTemp(l)) And i <> l Then
                pos = pos + 1
            End If
        Next
        For ii = 1 To 1
            If tableau(nb - pos) = "" Then
                tableau(nb - pos) = tabTemp(i)
            Else
                pos = pos + 1
                ii = ii - 1
            End If
        Next
    Next
End Sub

Puis ajoutez la ligne triDecroissant tableau dans votre code pour trier le tableau :

Sub exemple()
    
    Dim tableau(29)
    
    'Pour exemple : copie de A1 à A30 dans un tableau
    For i = 1 To 30
        tableau(i - 1) = Range("A" & i)
    Next

    'Tri du tableau
    triDecroissant tableau
    
    'Pour exemple : copie du tableau trié dans la colonne B
    For i = 1 To 30
        Range("B" & i) = tableau(i - 1)
    Next

End Sub

Astuce

Si vous avez installé l'add-in gratuit disponible sur Excel-Pratique, vous pouvez simplement utiliser arraySortAsc pour trier votre tableau :

Sub tri_croissant()

    tableau = Array("Test", 36, "Q", "ABCD", 8, 211, "XLP", 45)
     
    arraySortAsc tableau 'Tri croissant du tableau

End Sub

Utilisez arraySortAsc pour effectuer un tri croissant et arraySortDesc pour un tri décroissant.