『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】配列を昇順・降順・逆順にソートする方法

【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ステートメントを使用して、ソート後の配列を表示しています。この例は単純なソートアルゴリズムですが、他のソートアルゴリズム(例:クイックソート、マージソート)を使用することもできます。ただし、より複雑なアルゴリズムを実装する場合は、配列の要素数が多い場合でも効率的に動作するように最適化する必要があります。

コメント