【VBA】配列のソート:一番シンプルで分かりやすい「バブルソート」の仕組みと実装コード
VBAには配列を直接並び替える専用の標準関数がないため、自分でソートアルゴリズムを実装する必要があります。配列学習の第一歩として最も代表的で仕組みが分かりやすい「バブルソート(隣接交換法)」の解説と、VBAでの実装コードをご紹介します。
1. バブルソートとは?(仕組みと特徴)
バブルソートは、隣り合う2つの要素の値を比較し、順序が逆であれば入れ替えるという操作を繰り返すアルゴリズムです。水面の泡(Bubble)が下から上に浮き上がるように、大きな値が端へ順次移動していくことからこの名前がついています。
- メリット:コードの構造が非常にシンプルで、初心者でも理解しやすい。
- デメリット:データ数が多くなると処理速度が急激に落ちる(計算量 $O(n^2)$)。数万件以上の大量データには不向きです。
- 向いている場面:数十件〜数百件程度の小規模な配列の並び替え。
- データ型の注意点:大小比較(
>演算子)を行うため、今回は「整数あるいは数値」のみが格納された配列を対象としています。(文字列や型が混在していると、エラーや意図しない順序になる原因となるため注意が必要です)
2. VBAコードの実装
【標準モジュールへの記述】
数値の配列を昇順(小さい順)に並び替えるプロシージャと、動作確認用のテストコードです。
Option Explicit
' 動作確認用テストコード
Public Sub TestBubbleSort()
Dim arr As Variant
Dim i As Long
' テスト用の配列を用意(バラバラの数値)
arr = Array(42, 15, 8, 99, 23, 4)
Debug.Print "=== ソート前 ==="
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
' バブルソートの実行
Call BubbleSortAscending(arr)
Debug.Print "=== ソート後(昇順) ==="
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
' ======================================================================
' ■ バブルソート(昇順)の本体関数
' 【前提条件】
' - 引数 targetArr は Variant型の1次元配列(ByRefによる参照渡し)
' - 配列の要素は「整数あるいは数値」のみを想定しています。
' (文字列や型が混在していると、比較時に型不一致エラーや
' 意図しない順序になる原因となります)
' ======================================================================
Public Sub BubbleSortAscending(ByRef targetArr As Variant)
Dim i As Long, j As Long
Dim temp As Variant
Dim lBoundVal As Long, uBoundVal As Long
lBoundVal = LBound(targetArr)
uBoundVal = UBound(targetArr)
' 外側のループ:比較・入れ替えのパス数
For i = lBoundVal To uBoundVal - 1
' 内側のループ:隣接要素の比較
For j = lBoundVal To uBoundVal - 1 - (i - lBoundVal)
' 左側の値が右側の値より大きければ入れ替える
If targetArr(j) > targetArr(j + 1) Then
temp = targetArr(j)
targetArr(j) = targetArr(j + 1)
targetArr(j + 1) = temp
End If
Next j
Next i
End Sub
' 動作確認用テストコード
Public Sub TestBubbleSort()
Dim arr As Variant
Dim i As Long
' テスト用の配列を用意(バラバラの数値)
arr = Array(42, 15, 8, 99, 23, 4)
Debug.Print "=== ソート前 ==="
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
' バブルソートの実行
Call BubbleSortAscending(arr)
Debug.Print "=== ソート後(昇順) ==="
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
' ======================================================================
' ■ バブルソート(昇順)の本体関数
' 【前提条件】
' - 引数 targetArr は Variant型の1次元配列(ByRefによる参照渡し)
' - 配列の要素は「整数あるいは数値」のみを想定しています。
' (文字列や型が混在していると、比較時に型不一致エラーや
' 意図しない順序になる原因となります)
' ======================================================================
Public Sub BubbleSortAscending(ByRef targetArr As Variant)
Dim i As Long, j As Long
Dim temp As Variant
Dim lBoundVal As Long, uBoundVal As Long
lBoundVal = LBound(targetArr)
uBoundVal = UBound(targetArr)
' 外側のループ:比較・入れ替えのパス数
For i = lBoundVal To uBoundVal - 1
' 内側のループ:隣接要素の比較
For j = lBoundVal To uBoundVal - 1 - (i - lBoundVal)
' 左側の値が右側の値より大きければ入れ替える
If targetArr(j) > targetArr(j + 1) Then
temp = targetArr(j)
targetArr(j) = targetArr(j + 1)
targetArr(j + 1) = temp
End If
Next j
Next i
End Sub
3. 実行結果(イミディエイトウィンドウの出力)
実際に上記のコードを実行したところ、期待通りに数値が昇順に並び替えられることが確認できました。
=== ソート前 ===
42
15
8
99
23
4
=== ソート後(昇順) ===
4
8
15
23
42
99
42
15
8
99
23
4
=== ソート後(昇順) ===
4
8
15
23
42
99
4. まとめ
バブルソートはコードが短く、VBAの「配列の参照渡し(ByRef)」や「上下限の取得(LBound / UBound)」の仕組みを学ぶのに最適なアルゴリズムです。小規模な数値を手軽に整列させたいときは、ぜひこのコードを活用してみてください。
PR