[VBA] 配列を昇順・降順・逆順に並べ替えます

配列を昇順または降順に並べ替えます

 今回は 受け取った配列を昇順または降順に並べ替えるユーザー定義関数 を紹介します。昇順は数字を小さい順に並べること、降順は大きい順に並べることです。この2つの機能をひとつの関数でまとめて実装するので、とってもお得なレシピになってます。

'[VBA] 配列を昇順または降順に並べ替える関数

Option Base 1

Function SortArray(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

  SortArray = y()

End Function

 この関数は第 1 引数に渡す配列は必須ですが、2 つめの引数は「昇順」または「降順」を選択するためのオプション引数となっています。もしこの引数を省略すると自動的に 0 が入り、配列を昇順に並べ替えます。

 並び替えには Excel関数の Small関数と Large関数を利用しています。
 Small関数をワークシートで使う場合は

Small(セル範囲, 順位)

と記述します。第 2 引数で指定された値を x とすると、指定されたセル範囲にあるデータの中から「 x 番目小さい数」を取り出します。Large関数の場合は「 x 番目に大きい数」です。

 上のコードでは、オプション引数が 0 に指定された場合は、Small関数を使って 1 番小さな数を y(1) に入れて、その次に 2 番目に小さな数を y(2) に入れて ...... ということを繰り返して昇順並べを実現しています。

 それでは、SortArray関数を実際に呼びだして使ってみましょう。

'[VBA] SortArray関数のテストプログラム

Sub TestSort()

  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 = SortArray(a(), 1)

  For j = 1 To 5
   Debug.Print z(j);
  Next j

End Sub

 このマクロの中では、オプション引数を「 1 」に指定しているので、配列は降順(大きい順)に並び替えられて

 73 52 41 38 19

と表示されます。
 

配列要素を逆順に並べ替えます

 次は 配列を逆順に並べ替える関数 を作ってみます。
 たとえば、配列変数 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

が表示されます。

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)