【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】配列要素を逆順に並べ替えます

 次は配列を 逆順に並べ替える関数 を作ってみます。たとえば、配列変数 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() を実行すると、イミディエイトウィンドウに

peach
melon
banana
apple
orange

が表示されます。

コメント

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