配列を昇順または降順に並べ替えます
今回は 受け取った配列を昇順または降順に並べ替えるユーザー定義関数 のレシピ(←サンプルコードのこと)を紹介します。昇順は数字を小さい順に並べること、降順は大きい順に並べることです。この2つの機能をひとつの関数でまとめて実装するので、とってもお得なレシピになってますよ~。
'配列を昇順または降順に並べます
'オプション引数が省略された場合は 0 が指定されたとみなされます
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関数をワークシートで使う場合は
と記述します。第 2 引数で指定された値を x とすると、指定されたセル範囲にあるデータの中から「 x 番目小さい数」を取り出します。Large関数の場合は「 x 番目に大きい数」です。
上のコードでは、オプション引数が 0 に指定された場合は、Small関数を使って 1 番小さな数を y(1) に入れて、その次に 2 番目に小さな数を y(2) に入れて ...... ということを繰り返して昇順並べを実現しています。
それでは、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 」に指定しているので、配列は降順(大きい順)に並び替えられて
と表示されます。