2010-12-12 9 views
0

Je voudrais trier une plage en utilisant une permutation stockée dans un tableau. J'ai essayé quelque chose comme ceci:Excel VBA: tri d'une plage en utilisant un tableau de permutation comme clé

Sub PermSort() 
    Dim Perm() As Variant 
    Perm = Array(1, 6, 7, 8, 5, 2, 4, 3) 
    Range("A1:A8").Sort Key1:=Perm, order1:=xlAscending 
End Sub 

mais cela ne fonctionne pas, puisque Key1 devrait être une plage.
Est-il possible d'utiliser la méthode .Sort en quelque sorte?

Répondre

0

From here:

Le langage VBA n'a pas de support pour trier les valeurs mémorisées dans un tableau. Une méthode qui peut être utilisée pour trier les tableaux consiste à placer les données dans une feuille de calcul, trier les données dans la feuille de calcul, puis relire les valeurs de la feuille de calcul dans le tableau. L'autre méthode de tri des tableaux consiste à utiliser l'algorithme QSort pour trier le tableau en place. Cette page décrit les deux méthodes, avec des variations sur la méthode QSort.

HTH!

PS:

Le code correspondant à la première méthode est la suivante:

Sub SortViaWorksheet() 
    Dim Arr(1 To 5) As String ' this is the array to be sorted 
    Dim WS As Worksheet ' temporary worksheet 
    Dim R As Range 
    Dim N As Long 

    ' fill up the array with some 
    ' aribtrary values. 
    Arr(1) = "aaa" 
    Arr(2) = "zzz" 
    Arr(3) = "mmm" 
    Arr(4) = "ttt" 
    Arr(5) = "bbb" 

    Application.ScreenUpdating = False 

    ' create a new sheet 
    Set WS = ThisWorkbook.Worksheets.Add 

    ' put the array values on the worksheet 
    Set R = WS.Range("A1").Resize(UBound(Arr) - LBound(Arr) + 1, 1) 
    R = Application.Transpose(Arr) 

    ' sort the range 
    R.Sort key1:=R, order1:=xlAscending, MatchCase:=False 

    ' load the worksheet values back into the array 
    For N = 1 To R.Rows.Count 
     Arr(N) = R(N, 1) 
    Next N 

    ' delete the temporary sheet 
    Application.DisplayAlerts = False 
    WS.Delete 
    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 

    ' test/debug/confirmation 
    For N = LBound(Arr) To UBound(Arr) 
     Debug.Print Arr(N) 
    Next N 
End Sub 

Pour le second, il est une routine standard qsort. Vous pouvez le télécharger depuis le site d'origine.

Questions connexes