2010-12-12 20 views
0

配列に格納された置換を使用して範囲をソートしたいと思います。私はこのような何か試してみました:Excel VBA:置換配列をキーとして並べ替える

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 

をが、キー1が範囲であることが予想されているので、それは、動作しません。
何とか.Sortメソッドでビルドを使用できますか?

答えて

0

From here:

VBA言語は配列に格納された値を並べ替えをサポートしていません。配列のソートに使用できる1つの方法は、ワークシートにデータを配置し、ワークシート上のデータをソートし、ワークシートの値を配列に読み戻すことです。配列をソートするもう1つの方法は、QSortアルゴリズムを使用して配列を定位置にソートする方法です。このページでは、両方の方法と、QSortメソッドのバリエーションについて説明します。

HTH!

PS:

最初のメソッドのコードは次のとおりのqsort標準ルーチンがある1秒間

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 

。元のサイトからダウンロードすることができます。