実は、Excel標準の「並べ替え機能」を使わず、プログラムの中で「クイックソート」というアルゴリズム(手順)を使うと、処理速度は劇的に変わります。
今回は、ITが苦手な方でも「これなら使える!」と思えるように、クイックソートを噛み砕いて解説します。
クイックソートとは?
「クイックソート」という名前、なんだか難しそうですよね。
でも、やっていることは学校のクラスで行う「背の順の整列」 と同じです。
- リーダーを決める: クラスの中から適当に一人、リーダー(ピボット)を決めます。
- 左右に分かれる: リーダーより背が低い人は左へ、高い人は右へ移動します。
- 繰り返す: 左右に分かれたグループの中で、またリーダーを決めて同じことを繰り返します。
これを繰り返すと、あっという間に全員が背の順に並びますよね。これが「世界で最も効率的」と言われる整列アルゴリズムの正体です。
【コピペOK】クイックソートの実装コード
以下のコードをVBAエディタに貼り付けてみてください。難しい部分はコメントアウトで説明しています。
' メインの処理を呼び出すためのサンプル
Sub SampleUsage()
Dim lastRow As Long
' A列の最終行を動的に取得します
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
' 結果をB列に出力
' データがまったく存在しない場合は処理を終了します
If lastRow = 1 And IsEmpty(Cells(1, "A").Value) Then
MsgBox "並び替え対象のデータが見つかりません。"
Exit Sub
End If
' データが1件だけの場合は並び替えが不要なため、そのままB列に出力して終了します
If lastRow = 1 Then
Range("B1").Value = Cells(1, "A").Value
MsgBox "並び替えが完了しました!"
Exit Sub
End If
Dim myData As Variant
' 実際のデータが存在する範囲だけを配列に読み込みます
myData = Range("A1:A" & lastRow).Value
' クイックソート実行
Call QuickSort(myData, LBound(myData), UBound(myData))
' 結果をB列の同じ行数分だけ出力します
Range("B1:B" & lastRow).Value = myData
MsgBox "並び替えが完了しました!"
End Sub
' クイックソートの本体
Sub QuickSort(ByRef arr As Variant, ByVal leftIdx As Long, ByVal rightIdx As Long)
Dim pivot As Variant
Dim i As Long, j As Long
Dim temp As Variant
i = leftIdx
j = rightIdx
' 中央の値を「リーダー(ピボット)」に設定
pivot = arr((leftIdx + rightIdx) \ 2, 1)
Do While i <= j
' 中央の値を「リーダー(ピボット)」に設定
Do While arr(i, 1) < pivot
i = i + 1
Loop
' リーダーより大きい値を探す(右側から)
Do While arr(j, 1) > pivot
j = j - 1
Loop
' 見つけたら入れ替える
If i <= j Then
temp = arr(i, 1)
arr(i, 1) = arr(j, 1)
arr(j, 1) = temp
i = i + 1
j = j - 1
End If
Loop
If leftIdx < j Then Call QuickSort(arr, leftIdx, j)
If i < rightIdx Then Call QuickSort(arr, i, rightIdx)
End Sub
注意点:私の失敗談
このプログラムでは、処理の終盤で「再帰(さいき)」と呼ばれる、自分自身の関数を繰り返し呼び出す高度なテクニックを使用しています。
コピペする際は、If leftIdx < jなどの条件式を消さないようにお気をつけください。
初心者の頃、私はこの「終了条件」 を書き忘れて、プログラムが永遠に自分を呼び出し続け、Excelを強制終了させることもありました。
アルゴリズムという専門的な用語が出てくると少し身構えてしまいますが、中身は意外とシンプル。一度使えるようになると、事務作業の効率が劇的に上がります。
ぜひ試してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。
リンク
リンク

コメント