以前の記事「 配列をソートする 」では
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 |
これを使って
下の画像のシートをソートしてみます。
範囲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 |
実行結果:
配列は行単位で扱うことができないようです。
例えば
上のコードで使ったVariant型の配列でいうと
vData(3)
で3行目を扱うことはできませんでした。
vDataをウォッチウィンドウで見てみると
このようになっています。
これを見ると
vData(3)で3行目を扱えそうですが
できませんでした。
ちなみに
vData(3)をウォッチウィンドウで見てみると
値は「インデックスが有効範囲にありません」となります。
コメント