VBAで配列をソートする方法まとめ|1次元・2次元・バブルソートのコード付き

VBAで配列をソートする方法まとめ|1次元・2次元・バブルソートのコード付き

VBAで配列を使ったデータ処理に慣れてくると、
「配列の中身を並び替えたい」「特定の列順にソートしたい」
といったニーズが出てきますよね。

しかし、VBAには配列専用のソート関数が標準で用意されていないため、
自分でソート処理を組む必要があります。

本記事では、配列を並び替える方法として定番の「バブルソート」の仕組みや、
1次元・2次元配列での具体的なソート方法について、実際のコード例つきでやさしく解説します。

「ループ処理には慣れてきたけれど、配列の並び替えまでは自信がない…」
そんな方にもわかりやすく紹介していますので、ぜひ参考にしてみてください!

VBAで配列をソートするには?

VBAには配列用のソート関数が存在しない

Excelのワークシート関数には「SORT」や「SORTBY」など便利な並び替え機能がありますが、VBAには配列専用のソート関数が標準で用意されていません。

そのため、配列を並び替えるには 自分でソートのロジック(アルゴリズム)を記述する必要があります。代表的な手法には以下のようなものがあります:

  • バブルソート(初心者向けで動作がわかりやすい)

  • クイックソート(高速だが実装がやや複雑)

  • セルソート関数の併用(Rangeに書き戻してソートする)

ここでは、**初めてでも実装しやすい「バブルソート」**を中心に解説していきます。

バブルソートってなに?

バブルソートは、隣り合うデータを1つずつ比べて、必要に応じて入れ替えるというシンプルな並び替え方法です。

たとえば、数字が並んだ列で
「5 と 3 を比べて 5 が大きいから入れ替え」→「次の 5 と 1 を比べて入れ替え」
というように、小さい値を順に前に出していくイメージです。

動作の様子が泡(バブル)が浮かび上がるように見えることから、この名前がついています。

バブルソート


ソートの対象は1次元?2次元?

配列を並び替えるとき、ソート対象の「次元」によって処理方法が変わります。

配列の種類 ソート内容の例 難易度
1次元配列 数値の昇順・降順に並べ替え ★☆☆(かんたん)
2次元配列 特定の列を基準に行全体を並べ替え ★★★(やや難しい)

たとえば以下のような配列の場合:

arr = Range(“A1:B5”).Value

「A列(第1列)の値を昇順に並べ替えたい」という場合、2次元配列を1行ずつ操作して並べ替える必要があります。

このあと、1次元配列・2次元配列それぞれのバブルソートの実装例を紹介していきます。

配列の並び替えの実装例(バブルソート)

1次元配列を昇順に並び替える例

まずは、もっとも基本的な 1次元配列の昇順ソートの例を見てみましょう。

Sub SortArray1D()
 Dim arr As Variant
 Dim i As Long, j As Long
 Dim temp As Variant

 ' 配列にデータを格納(例:5つの数字)
 arr = Array(8, 3, 6, 1, 5)

 ' バブルソートで昇順に並べ替え
 For i = LBound(arr) To UBound(arr) - 1
  For j = i + 1 To UBound(arr)
   If arr(i) > arr(j) Then
    ' 値を入れ替え
    temp = arr(i)
    arr(i) = arr(j)
    arr(j) = temp
   End If
  Next j
 Next i

 ' 結果を表示(例としてセルA列に出力)
 For i = LBound(arr) To UBound(arr)
  Cells(i + 1, 1).Value = arr(i)
 Next i
End Sub

ポイント:

  • LBound/UBound を使って、配列の範囲を安全にループします

  • 配列の値を一時変数 temp を使って入れ替えています

  • 昇順(小さい順)に並べ替えているが、条件を変えれば降順にもできます。
    ※If arr(i) > arr(j) Thenの条件を変更

↓サンプルコードの実行結果:
セルに並び替え後のデータが表示されています。

バブルソートによる一次配列並び替え例


2次元配列を特定の列で並び替える例

次は、2次元配列の「第1列(A列)」を基準に昇順で並べ替える方法です。

Sub SortArray2D()
 Dim arr As Variant
 Dim i As Long, j As Long
 Dim temp As Variant
 Dim rowCount As Long, colCount As Long

 ' データ部分(ヘッダー除く)を配列に読み込む
 arr = Range("A2:H21").Value
 rowCount = UBound(arr, 1)
 colCount = UBound(arr, 2)

 ' バブルソート:1列目(商品コード)を基準に昇順
 For i = 1 To rowCount - 1
  For j = i + 1 To rowCount
   If arr(i, 1) > arr(j, 1) Then

    ' 1行(全列)ごと入れ替え
    For k = 1 To colCount
     temp = arr(i, k)
     arr(i, k) = arr(j, k)
     arr(j, k) = temp
    Next k

   End If
  Next j
 Next i

 ' 並び替えたデータを別セルに出力(ヘッダー付き)
 Range("J1:Q1").Value = Range("A1:H1").Value ' ヘッダーコピー
 Range("J2:Q21").Value = arr ' ソート後のデータ出力
End Sub

↓サンプルコードを実行した結果:
商品コード順に並び替えされています。

二次元配列並び替えサンプル

補足

このマクロでは、表の1列目(商品コード)を基準に並び替えを行っています。

「arr(i, 1) > arr(j, 1)」という部分で、2つの行の値を見比べて、順番が逆なら入れ替えるという仕組みです。

ただし、商品コードだけを入れ替えると、他の列(商品名・型番など)の情報がバラバラになってしまいます。
そこで、1列ずつすべての値をセットで入れ替える=1行まるごと交換することで、行の対応関係を保ったまま正しく並び替えられるようにしています。

列数が多いとすべてを手作業で書くのは大変なので、
以下のように For k = 1 To 列数 のような繰り返し処理でまとめて入れ替える方法が便利です。

複数条件で並び替えるには?

「在庫数が同じときは商品名で並び替える」など、複数条件でのソート方法も可能です。

詳しくは別記事にまとめて紹介を予定しています。

まとめ

この記事では、VBAで配列を操作する際の「コピー」「変換」「ソート」について、具体的なコード例を交えて解説しました。

  • セル範囲との一括読み書きは、配列を使うことで高速かつ簡潔に実装できます。

  • **配列の並び替え(ソート)**は標準関数がないため、基本的なバブルソートを使って1次元・2次元での処理方法を紹介しました。

特に2次元配列のソートでは、「どの列を基準に並び替えるか」「全体をどう保持するか」が重要なポイントとなります。


関連記事リンク

配列の理解を深めたい方は、以下の記事もぜひご覧ください。