配列のソート
Excel VBAで「配列を並べ替えたい」とき、シートに書き戻して並べ替える方法もありますが、大量データでは遅くなります。そこで 配列を直接ソート するテンプレを紹介します。初心者向けに、コード例をかみ砕いて説明します。
基本の考え方
- 一次元配列: 値を昇順・降順に並べ替える。
- 二次元配列: 特定の列を基準に並べ替える。
- アルゴリズム: VBAには組み込みソートがないので、自作(バブルソート・クイックソートなど)を使う。
- 小規模ならバブルソート、大規模ならクイックソート が定番。
テンプレ1:一次元配列のバブルソート(昇順)
Sub SortArray_1D_Bubble()
Dim arr As Variant
arr = Array(30, 10, 50, 20, 40)
Dim i As Long, j As Long, tmp As Variant
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
tmp = arr(i)
arr(i) = arr(j)
arr(j) = tmp
End If
Next j
Next i
' 結果を出力
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB- ポイント: 小規模データならこれで十分。昇順に並ぶ。
テンプレ2:一次元配列のクイックソート(高速版)
Sub SortArray_1D_Quick()
Dim arr As Variant
arr = Array(30, 10, 50, 20, 40)
QuickSort arr, LBound(arr), UBound(arr)
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
Private Sub QuickSort(arr As Variant, ByVal first As Long, ByVal last As Long)
Dim i As Long, j As Long
Dim pivot As Variant, tmp As Variant
i = first: j = last
pivot = arr((first + last) \ 2)
Do While i <= j
Do While arr(i) < pivot: i = i + 1: Loop
Do While arr(j) > pivot: j = j - 1: Loop
If i <= j Then
tmp = arr(i): arr(i) = arr(j): arr(j) = tmp
i = i + 1: j = j - 1
End If
Loop
If first < j Then QuickSort arr, first, j
If i < last Then QuickSort arr, i, last
End Sub
VB- ポイント: 大量データでも高速。昇順に並ぶ。
テンプレ3:二次元配列を特定列でソート
例:A列=コード、B列=商品名、C列=数量。数量列で昇順に並べ替える。
Sub SortArray_2D_ByColumn()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A2:C" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
Dim v As Variant: v = rg.Value
Dim i As Long, j As Long, tmp As Variant
For i = 1 To UBound(v, 1) - 1
For j = i + 1 To UBound(v, 1)
If v(i, 3) > v(j, 3) Then ' C列=数量で比較
tmp = v(i, 1): v(i, 1) = v(j, 1): v(j, 1) = tmp
tmp = v(i, 2): v(i, 2) = v(j, 2): v(j, 2) = tmp
tmp = v(i, 3): v(i, 3) = v(j, 3): v(j, 3) = tmp
End If
Next j
Next i
' 並べ替えた配列をシートに書き戻す
ws.Range("A2").Resize(UBound(v, 1), UBound(v, 2)).Value = v
End Sub
VB- ポイント: 二次元配列は「行ごと入れ替え」。基準列を指定して比較。
テンプレ4:文字列配列のソート
Sub SortArray_String()
Dim arr As Variant
arr = Array("みかん", "りんご", "バナナ", "ぶどう")
Dim i As Long, j As Long, tmp As Variant
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
tmp = arr(i): arr(i) = arr(j): arr(j) = tmp
End If
Next j
Next i
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB- ポイント: 文字列も比較可能。昇順なら「あいうえお順」になる。
例題で練習
'例1:数値配列をバブルソート
Sub Example_Bubble()
SortArray_1D_Bubble
End Sub
'例2:数値配列をクイックソート
Sub Example_Quick()
SortArray_1D_Quick
End Sub
'例3:二次元配列を数量列でソート
Sub Example_2D()
SortArray_2D_ByColumn
End Sub
'例4:文字列配列をソート
Sub Example_String()
SortArray_String
End Sub
VB初心者向けポイント
- 小規模ならバブルソート: コードが簡単で理解しやすい。
- 大量データならクイックソート: 高速で効率的。
- 二次元配列は行ごと入れ替え: 基準列を決めて比較。
- 文字列も比較できる:
><で辞書順に並ぶ。 - UBound/LBoundで範囲確認: 配列のサイズを動的に扱うときは必須。
