« シートの並び替えをする | トップページ | 数式を値に変換する2 »

2011年2月12日 (土)

2次元配列をソートする

以前の記事「 配列をソートする 」では
1次元の配列をソートする方法でしたが
今回は2次元配列をソートします。

上記の記事で使ったBubbleSort2を改造して
2次元配列をソートできるようにしました。

BubbleSortのほうが
大きい配列をソートするのを
速くできるようなので
BubbleSortのほうにしました。

コードはi番目の要素と
i+1番目の要素を入れ替えるところを変更しただけです。

2次元配列をソートするためには
i番目の「行」と
i+1番目の「行」を入れ替えなくてはいけません。

行の要素を1つ1つ入れ替えるために
変数jを使ったFor文を使います。

コードはこちら

2次元配列をソートするコード:

Function BubbleSort3(TempArray As Variant, Col As Integer, Order As Integer)
'Option Base 1で実行
'Col= ソートの基準の列
'Order = 0 昇順
'Order = 1 降順

    Dim Temp() As Variant
    ReDim Temp(1, UBound(TempArray, 2))
   
    Dim i As Integer, j As Integer
    Dim NoExchanges As Integer

    ' ループの終わりでNoExchanges = Trueで終了
    Do
        NoExchanges = True

        For i = 1 To UBound(TempArray, 1) - 1
            If Order = 0 Then
                '昇順
                If TempArray(i, Col) > TempArray(i + 1, Col) Then
                    NoExchanges = False
                    For j = 1 To UBound(TempArray, 2)
                        Temp(1, j) = TempArray(i, j)
                    Next j
                    For j = 1 To UBound(TempArray, 2)
                        TempArray(i, j) = TempArray(i + 1, j)
                    Next j
                    For j = 1 To UBound(TempArray, 2)
                        TempArray(i + 1, j) = Temp(1, j)
                    Next j
                End If
            ElseIf Order = 1 Then
                '降順
                If TempArray(i, Col) < TempArray(i + 1, Col) Then
                    NoExchanges = False
                    For j = 1 To UBound(TempArray, 2)
                        Temp(1, j) = TempArray(i, j)
                    Next j
                    For j = 1 To UBound(TempArray, 2)
                        TempArray(i, j) = TempArray(i + 1, j)
                    Next j
                    For j = 1 To UBound(TempArray, 2)
                        TempArray(i + 1, j) = Temp(1, j)
                    Next j
                End If
            End If
        Next i
    Loop While Not (NoExchanges)

End Function

これを使って
下の画像のシートをソートしてみます。
Vba20110212a

範囲A2:G11を配列に格納して、
A列を基準に降順にソートします。
ソートした配列をA20を基準に出力します。

ここではわかりやすく
シートのデータを配列の内容に使っています。
シートのデータ(セル)を並び替えるだけなら
「並び替え」をVBAで実行するのがいいと思います。

BubbleSort3使用例:

Sub macro110212a()
'BubbleSort3使用例
   
    'ソートする配列
    Dim vData As Variant
    vData = Range("A2:G11")
   
    '配列vDataを1列目を基準に降順にソートする
    Call BubbleSort3(vData, 1, 0)
   
    'ソート後の配列を出力
    Range("A20").Resize(UBound(vData), UBound(vData, 2)) = vData
   
End Sub

実行結果:
Vba20110212b

配列は行単位で扱うことができないようです。

例えば
上のコードで使ったVariant型の配列でいうと
vData(3)
で3行目を扱うことはできませんでした。

vDataをウォッチウィンドウで見てみると
このようになっています。
Vba20110212c

これを見ると
vData(3)で3行目を扱えそうですが
できませんでした。

ちなみに
vData(3)をウォッチウィンドウで見てみると
値は「インデックスが有効範囲にありません」となります。

|

« シートの並び替えをする | トップページ | 数式を値に変換する2 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 2次元配列をソートする:

« シートの並び替えをする | トップページ | 数式を値に変換する2 »