なんだかGoodVibes

日々の勉強メモです。

【VBA】配列のソート

こんにちは。
VBAでの配列のソート方法のメモです。
本記事では、4つの方法を記載します。


InsertionSort

昇順でソートを行います。
引数は、以下です。

  • 第1引数:対象の配列
  • 第2引数:配列の最小要素数(LBound)
  • 第3引数:配列の最大要素数(UBound)
Private Sub InsertionSort(ByRef arr() As Long, ByVal low As Long, ByVal high As Long)
    Dim i As Long
    Dim k As Long
    Dim tmp As Long

    For i = low + 1 To high
        tmp = arr(i)
        If arr(i - 1) > tmp Then
            k = i

            Do While k > low
                If arr(k - 1) <= tmp Then
                    Exit Do
                End If

                arr(k) = arr(k - 1)
                k = k - 1
            Loop

            arr(k) = tmp
        End If
    Next
End Sub


QuickSort

昇順でソートを行います。
引数は、以下です。

  • 第1引数:対象の配列
  • 第2引数:配列の最小要素数(LBound)
  • 第3引数:配列の最大要素数(UBound)
Private Sub QuickSort(ByRef arr() As Long, ByVal low As Long, ByVal high As Long)

    Dim l As Long: l = low
    Dim h As Long: h = high

    Dim pivot As Variant
    pivot = arr((low + high) \ 2)

    Dim tmp As Long
    Do While (l <= h)
        Do While (arr(l) < pivot And l < high)
            l = l + 1
        Loop
        Do While (pivot < arr(h) And h > low)
            h = h - 1
        Loop

        If (l <= h) Then
            tmp = arr(l)
            arr(l) = arr(h)
            arr(h) = tmp
            l = l + 1
            h = h - 1
        End If
    Loop

    If (low < h) Then
        Call QuickSort(arr, low, h)
    End If
    If (l < high) Then
        Call QuickSort(arr, l, high)
    End If
End Sub


SmallSort

昇順でソートを行います。
引数は、対象の配列です。
戻り値は結果(ソートした配列)です。

Private Function SmallSort(ByRef arr() As Long) As Long()

    Dim h As Long: h = UBound(arr)
    Dim result() As Long

    ReDim result(h)

    Dim i As Long
    For i = 0 To h
        result(i) = WorksheetFunction.Small(arr(), i + 1)
    Next i

    SmallSort = result()

End Function


LargeSort

降順でソートします。
引数は、対象の配列です。
戻り値は結果(ソートした配列)です。

Private Function LargeSort(ByRef arr() As Long) As Long()

    Dim h As Long: h = UBound(arr)
    Dim result() As Long

    ReDim result(h)

    Dim i As Long
    For i = 0 To h
        result(i) = WorksheetFunction.Large(arr(), i + 1)
    Next i

    LargeSort = result()

End Function


まとめ

配列をソートすることって結構あると思うので
色々な方法を覚えていたら便利ですね。
ちなみに、今回はLong型の配列に対してソートを行う
サンプルになっています。
使う用途に合わせて変更してもらえればと思います。
以上です。