ロジックでソートを行う

Excel を使っているので ソートは Excel の機能を使ってもよいのですが 他の言語でも使えるロジックなので整理しておきます

ソートを行う件数が少ない場合には 単純なソートを行えばよいのですが 件数が多い場合にはクイックソートが有効でしょう
クイックソートは再帰呼び出しが発生するので 起動する関数とは分ける必要があります

    Dim SortData(99) As Long

    QSort SortData, 0, 99


Private Sub QSort(ByRef l_arr() As Long, ByVal l_min As Long, ByVal l_max As Long)

    Dim l_center As Long
    Dim l_idx As Long
    Dim l_set As Long
    Dim l_compare As Long
    Dim l_exchange As Long

    If (l_min >= l_max) Then Exit Sub

    l_center = (l_min + l_max) \ 2
    l_compare = l_arr(l_center)
    l_arr(l_center) = l_arr(l_min)

    l_set = l_min
    For l_idx = (l_min + 1) To l_max
        If (l_arr(l_idx) < l_compare) Then
            l_set = l_set + 1
            l_exchange = l_arr(l_set)
            l_arr(l_set) = l_arr(l_idx)
            l_arr(l_idx) = l_exchange
        End If
    Next l_idx
    l_arr(l_min) = l_arr(l_set)
    l_arr(l_set) = l_compare

    Call QSort(l_arr, l_min, l_set - 1)
    Call QSort(l_arr, l_set + 1, l_max)

End Sub

件数が少ない場合には バブルソートでも問題ないのかも知れませんが クイックソートが関数化されているので 必要性は少ない
かも知れません
簡単なロジックですが 一応 残しておきます

Dim SortData(99) As Long

Dim l_idx1 As Long
Dim l_idx2 As Long
Dim l_exchange As Long

For l_idx1 = 0 To UBound(SortData) - 1
    For l_idx2 = (l_idx1 + 1) To UBound(SortData)
        If (SortData(l_idx1) > SortData(l_idx2)) Then
            l_exchange = SortData(l_idx1)
            SortData(l_idx1) = SortData(l_idx2)
            SortData(l_idx2) = l_exchange
        End If
    Next l_idx2
Next l_idx1