Excel VBA 逆引き集 | 配列のソート

Excel VBA
スポンサーリンク

配列のソート

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で範囲確認: 配列のサイズを動的に扱うときは必須。
タイトルとURLをコピーしました