Excelのデータ範囲やVBAの配列を、元のデータを変更することなく、並べ替えた(ソートした)結果だけをメモリ上で取得したいという高度なニーズがあります。
Excel for Microsoft 365およびExcel 2021以降で利用可能になった**SORT
関数**をVBAから呼び出すことで、この処理を非常にシンプルかつ高速に実現できます。
この記事では、WorksheetFunction.Sort
を使い、セル範囲やVBA配列を自在に並べ替える方法を解説します。
【重要】SORT関数が使える環境
このテクニックを利用するには、お使いのExcelが**SORT
関数をサポートしているバージョン(Microsoft 365 または Excel 2021以降)**である必要があります。旧バージョンのExcelではこのコードは実行できません。
1. セル範囲を並べ替える(基本)
まず、ワークシート上のデータ範囲を並べ替える最も基本的な方法です。
コードと解説
Sub SortRangeWithFunction()
' 変数を宣言します
Dim sourceRange As Range
Dim sortedResult As Variant
' 並べ替えたいデータ範囲を設定
Set sourceRange = ThisWorkbook.Worksheets("DataSheet").Range("C2:C20")
' --- 1. SORT関数で範囲を並べ替え、結果を配列に格納 ---
' 引数を省略すると、昇順で並べ替えられます
sortedResult = WorksheetFunction.Sort(sourceRange)
' --- 2. 並べ替えた結果の配列から値を取り出して表示 ---
MsgBox "昇順に並べ替えた結果の上位3件:" & vbCrLf & _
"1位: " & sortedResult(1, 1) & vbCrLf & _
"2位: " & sortedResult(2, 1) & vbCrLf & _
"3位: " & sortedResult(3, 1), vbInformation, "ソート結果"
'--- 3. (応用) 並べ替えた結果をシートに書き出す ---
' D2セルを起点に、配列の大きさで範囲を拡張して一括で書き込み
' ThisWorkbook.Worksheets("DataSheet").Range("D2").Resize(UBound(sortedResult, 1)).Value = sortedResult
End Sub
WorksheetFunction.Sort(sourceRange)
: この一行で、指定したsourceRange
の値を昇順で並べ替えた2次元配列が返されます。sortedResult(1, 1)
:SORT
が返した配列の最初の要素(1行目, 1列目)にアクセスしています。
2. VBA配列を並べ替える(応用)
SORT
関数は、セル範囲だけでなく、VBA内で作成した配列を並べ替えることもできます。さらに、詳細な引数を指定することで、降順での並べ替えも可能です。
コードと解説
Sub SortVbaArray()
' 変数を宣言します
Dim originalList As Variant
Dim sortedList As Variant
' 並べ替えたいVBAの配列を作成
originalList = Array("りんご", "みかん", "ぶどう", "いちご")
' --- SORT関数で配列を降順に並べ替え ---
sortedList = WorksheetFunction.Sort(originalList, , -1) ' 第3引数に-1を指定
' Join関数で配列の要素をカンマ区切りで連結して表示
MsgBox "元の配列: " & Join(originalList, ", ") & vbCrLf & vbCrLf & _
"降順に並べ替えた結果: " & Join(sortedList, ", "), vbInformation, "配列のソート"
End Sub
SORT関数の主な引数
SORT
関数には、より細かな制御を行うための任意引数があります。 SORT(array, [sort_index], [sort_order], [by_col])
array
(必須): 並べ替えるセル範囲または配列。[sort_index]
(任意): 複数列の範囲を並べ替える際に、どの列を基準にするかを数値で指定します。(例: 2番目の列を基準にするなら2
)[sort_order]
(任意): 並べ順を指定します。1
: 昇順(A→Z, 小→大) (既定値)-1
: 降順(Z→A, 大→小)
[by_col]
(任意): 並べ替えの方向を指定します。False
: 行を基準に並べ替え(既定値)True
: 列を基準に並べ替え
まとめ
SORT
関数が利用できるモダンなExcel環境では、VBAでの並べ替え処理が非常に簡単になります。
WorksheetFunction.Sort(対象)
を使うことで、元のデータを一切変更せずに、並べ替えた結果を配列として取得できる。- セル範囲だけでなく、VBAの配列も直接並べ替えられる。
- 任意引数を指定することで、降順などの複雑な並べ替えも一行で実現できる。
この関数は、データを物理的に並べ替える必要がなく、ソートされたリストが一時的に必要になる場面などで絶大な効果を発揮します。