【VBA】配列を昇順または降順に並べ替えます
今回は受け取った配列を昇順または降順に並べ替えるユーザー定義関数を掲載します。昇順は数字を小さい順に並べること、降順は大きい順に並べることです。この2つの機能をひとつの関数でまとめて実装するので、とってもお得なレシピになってます。
'[VBA] 配列を昇順または降順に並べ替える関数 Option Base 1 Function Sort_Array(x() As Variant, Optional s As Long = 0) As Variant Dim k As Long Dim ub As Long Dim y() As Variant '配列x()のインデックス上限値を取得 ub = UBound(x) '配列y()のインデックス上限値を設定 ReDim y(ub) For k = 1 To ub 'オプション引数s=0は昇順です If s = 0 Then y(k) = WorksheetFunction.Small(x(), k) 'オプション引数sに0以外の値が入ると降順です Else y(k) = WorksheetFunction.Large(x(), k) End If Next k Sort_Array = y() End Function
この関数は第1引数に渡す配列は必須ですが、2 つめの引数は「昇順」または「降順」を選択するためのオプション引数となっています。もしこの引数を省略すると自動的に 0 が入り、配列を昇順に並べ替えます。
並び替えにはワークシート関数の Small と Large を利用しています。Small関数をワークシートで使う場合は
Small(セル範囲, 順位)
と記述します。第2引数で指定された値を x とすると、指定されたセル範囲にあるデータの中から「x 番目小さい数」を取り出します。Large関数の場合は「x 番目に大きい数」です。
上のコードでは、オプション引数が 0 に指定された場合は、Small関数を使って 1 番小さな数を y(1) に入れて、その次に 2 番目に小さな数を y(2) に入れて … ということを繰り返して昇順並べを実現しています。それでは、Sort_Array関数を実際に呼びだして使ってみましょう。
'[VBA] Sort_Array関数のテストプログラム Sub Test_Sort() Dim z As Variant Dim a(5) As Variant Dim j As Long a(1) = 52 a(2) = 73 a(3) = 41 a(4) = 19 a(5) = 38 z = Sort_Array(a(), 1) For j = 1 To 5 Debug.Print z(j); Next j End Sub
Test_Sort() では、オプション引数を「 1 」に指定しているので、配列は降順(大きい順)に並び替えられて
73 52 41 38 19
と表示されます。
➡【VBA】動的配列とRedimステートメント
【VBA】配列要素を逆順に並べ替えます
次は配列を逆順に並べ替える関数を作ってみます。たとえば、配列変数 x(i) に
x(1) = orange x(2) = apple x(3) = banana x(4) = melon x(5) = peach
のように格納されている要素を、新しい配列変数 y(i) に
y(1) = x(5) y(2) = x(4) y(3) = x(3) y(4) = x(2) y(5) = x(1)
のように格納し直すことで逆順ソートを実現できます。
'[VBA] 配列要素を逆順に並べるFunctionプロシージャ Option Base 1 Function REVERSE(x() As Variant) As Variant Dim n As Long, i As Long Dim ub As Long Dim y() As Variant ub = UBound(x) ReDim y(ub) For i = 1 To ub y(i) = x(ub - i + 1) Next i REVERSE = y() End Function
さっそく、REVERSE 関数をテストしてみましょう。
'[VBA] Reverse関数のテストプロシージャ Sub Test_Reverse() Dim x(5) As Variant Dim y As Variant Dim i As Long x(1) = "orange" x(2) = "apple" x(3) = "banana" x(4) = "melon" x(5) = "peach" y = REVERSE(x()) For i = 1 To 5 Debug.Print y(i) Next i End Sub 'Test_Reverse の実行結果: 'melon 'banana 'apple 'orange
バブルソート・アルゴリズム
ChatGPT に配列を昇順に並べ替える方法を尋ねたら、バブル・ソートのアルゴリズムを教えてくれました。
[ChatGPT] VBA(Visual Basic for Applications)を使用して配列を昇順に並べ替えるには、配列をソートするための関数やメソッドを使用する必要があります。VBAでは配列を直接ソートする関数は提供されていないため、ソートアルゴリズムを自分で実装する必要があります。以下に、VBAで配列を昇順に並べ替える一般的なアルゴリズムの例を示します。
Sub SortArrayAscending() Dim arr() As Variant Dim i As Long, j As Long Dim temp As Variant ' 配列を初期化 arr = Array(5, 2, 8, 1, 9) ' バブルソートアルゴリズムを使用して配列を昇順にソート For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If arr(i) > arr(j) Then temp = arr(j) arr(j) = arr(i) arr(i) = temp End If Next j Next i ' ソート後の配列を表示 For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next i End Sub
この例では、arrという名前の配列を使用しています。バブルソートアルゴリズムを使用して、配列内の要素を比較し、必要に応じて入れ替えます。Debug.Printステートメントを使用して、ソート後の配列を表示しています。この例は単純なソートアルゴリズムですが、他のソートアルゴリズム(例:クイックソート、マージソート)を使用することもできます。ただし、より複雑なアルゴリズムを実装する場合は、配列の要素数が多い場合でも効率的に動作するように最適化する必要があります。
コメント