文系でも納得!VBAクイックソート入門|再帰処理を「リーダー決め」で理解する

【業務効率化】VBA
スポンサーリンク

実は、Excel標準の「並べ替え機能」を使わず、プログラムの中で「クイックソート」というアルゴリズム(手順)を使うと、処理速度は劇的に変わります。

今回は、ITが苦手な方でも「これなら使える!」と思えるように、クイックソートを噛み砕いて解説します。

【業務効率化】VBAの記事を見る 

クイックソートとは?

「クイックソート」という名前、なんだか難しそうですよね。
でも、やっていることは学校のクラスで行う「背の順の整列」 と同じです。

  1. リーダーを決める: クラスの中から適当に一人、リーダー(ピボット)を決めます。
  2. 左右に分かれる: リーダーより背が低い人は左へ、高い人は右へ移動します。
  3. 繰り返す: 左右に分かれたグループの中で、またリーダーを決めて同じことを繰り返します。

これを繰り返すと、あっという間に全員が背の順に並びますよね。これが「世界で最も効率的」と言われる整列アルゴリズムの正体です。

【コピペ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の記事を見る 


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました