このページの内容について
このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第十二回記事です。公式テキスト第7章「データの並べ替え」の内容について解説します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。
並べ替え(Sortオブジェクト)
Excelには表の並び替えを行う機能があります。WorksheetオブジェクトのプロパティであるSortオブジェクトは、この並び替え機能をマクロで呼び出すことができます。

並び替えキーの設定(SortFeildsコレクション)
並べ替えをするために表の中のどの列(もしくは行)をキーにして並べ替えを実行するのかを設定します。並べ替えキーの設定はSortオブジェクトのプロパティSortFeildsコレクションを使用します。SortFeildsコレクションはSortFeildオブジェクトの集合体です。このSortFieldオブジェクトひとつが、並び替えキー1つに相当します。

Clearメソッド
並べ替えキーを設定するためにまずは、現在適用されている並べ替えキーをリセットします。並べ替えキーのリセットにはSortFieldsコレクションのClearメソッドを使用します。
サンプルコード(クリックでコピー)
Private Sub Test_SortFieldsClear()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
End Sub
実行結果
上記サンプルコードを、なにか適当な並べ替えをしたあとに、実行すると以下のように設定した並べ替えキーがすべてクリアされます。

↓マクロ実行後

Add/Add2メソッド
SortFeildsコレクションにSortFeildオブジェクトを追加するには「Add」もしくは「Add2」メソッドを使用します。ただし、SortFeildオブジェクトを追加しただけでは、まだ並び替えキーは設定されません。これは手動で並び替えを実行する場合に、実際に並び替えを実行するまでは並び替えキーが保存されないことと同じ動作です。
引数 | 型 | 役割 |
---|---|---|
Key | Range | キーに指定したい列(行)に含まれるセル |
SortOn | Variant(XlSortOn) | xlSortOnValues ・・ 値での並び替え xlSortOnCellColor ・・ 背景色での並び替え xlSortOnFontColor ・・ 文字色での並び替え xlSortOnIcon ・・ 条件付き書式のアイコンでの並び替え |
Order | Variant(XlSortOrder) | xlAscending ・・ 昇順 xlDescending ・・ 降順 |
CustomOrder | Variant | ユーザー設定の並べ替え |
DataOption | Variant(XlSortDataOption) | xlSortNormal ・・ 数値とテキストを別で xlSortTextAsNumbers ・・ 数値とみなせるテキストは数値で |
サンプルコード(クリックでコピー)
Private Sub Test_SortFieldsAdd2()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"))
Stop
End Sub
実行結果
上記サンプルコードを実行するとSortFieldsコレクションにSortFeildオブジェクトを追加して動作を停止します。このときローカルウィンドウでは確かにSortFeildオブジェクトが追加されたことが確認できますが、Excelの並べ替えの画面を開くと、まだキーが追加されていません。また、省略可能な引数をすべて省略しているため、並び替え条件が保存されているプロパティにはすべて既定値が入力されています。


並べ替えの実行(Sortオブジェクト)
並べ替えキーの設定が完了したあとは、並べ替えの範囲などを設定し、並べ替えを実行します。
SetRangeメソッド
並び替えの範囲はSortオブジェクトの「SetRange」メソッドを使用します。範囲を指定しただけでは、まだ並び替えは実行されません。
引数 | 型 | 役割 |
---|---|---|
Rng | Range | 並び替えの範囲をRangeで指定する |
サンプルコード(クリックでコピー)
Private Sub Test_SortSetRange()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"))
Call so.SetRange(ws.Range("A1:G10"))
End Sub
実行結果
上記サンプルコードを実行すると、Sortオブジェクトに並べ替え範囲を設定します。ここまでの設定をしてもまだ並べ替えは実行されていません。
Applyメソッド
並び替えの実行は、Sortオブジェクトの「Apply」メソッドを使用します。引数はありません。ここまで設定した並べ替え条件で並べ替えが実行されます。
サンプルコード(クリックでコピー)
Private Sub Test_SortApply()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"))
Call so.SetRange(ws.Range("A1:G10"))
Call so.Apply
End Sub
実行結果
上記サンプルコードを実行すると、並べ替えが実行されます。この並べ替えはマクロが動作中のブックの一番左のシートのセル範囲「A1:G10」にある表をA列の昇順で並べ替えます。表がないとエラーになります。
並べ替えオプションの指定
ここまでは並べ替えに必要な最低限の設定で並べ替えを実行しました。しかし実務では並べ替えのキーが複数あったり、キーによって昇順・降順が異なったり、文字列として格納された数値を数値とみなして並べ替えたかったりします。オプションは多くあるため、一部抜粋して解説します。
Orderプロパティ(昇順・降順)
並び替えの昇順・降順の制御はSortFieldオブジェクトの「Oeder」プロパティを書き換えることで変更できます。書き換える方法は2つあります。1つはSortFieldオブジェクトの「Oeder」プロパティを直接書き換える方法。もう1つはSortFieldsコレクションの「Add2」メソッドの引数で指定する方法です。
サンプルコード(クリックでコピー)
Private Sub Test_SortOrder()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"))
sf.Item(1).Order = xlDescending
Call so.SetRange(ws.Range("A1:G10"))
Call so.Apply
End Sub
Private Sub Test_SortOrderPre()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"), Order:=xlDescending)
Call so.SetRange(ws.Range("A1:G10"))
Call so.Apply
End Sub
実行結果
上記サンプルコードを実行すると、どちらもA列の降順で表を並び替えます。
DataOptionプロパティ(数値とみなせる文字列)
「数値に見えるものはすべて数値として並び替えを行う」「数値とテキスト形式の数値を分けて並び替えを行う」このオプションは「DataOption」プロパティで制御できます。「Order」プロパティと同様「Add2」メソッドの引数に指定することもできます。

サンプルコード(クリックでコピー)
Private Sub Test_SortDataOption()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"))
sf.Item(1).DataOption = xlSortTextAsNumbers
Call so.SetRange(ws.Range("A1:G10"))
Call so.Apply
End Sub
Private Sub Test_SortDataOptionPre()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"), DataOption:=xlSortTextAsNumbers)
Call so.SetRange(ws.Range("A1:G10"))
Call so.Apply
End Sub
実行結果
上記サンプルコードを実行すると、どちらもA列の文字列形式の数値を数値とみなして並べ替えを実行します。
Headerプロパティ(タイトルを並び替えに含めるか)
Sortオブジェクトの「Header」プロパティを書き換えることでタイトル行(列)を並び替えに含めるかを指定することができます。
サンプルコード(クリックでコピー)
Private Sub Test_SortHeader()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("A1"), DataOption:=xlSortTextAsNumbers)
Call so.SetRange(ws.Range("A1:G10"))
so.Header = xlYes
Call so.Apply
End Sub
実行結果
上記サンプルコードを実行すると、1行目をタイトル行とみなして並び替えを実行します。
複数の並べ替えキーを設定する
複数の並べ替えキーを設定するにはSortFieldsコレクションにSortFieldオブジェクトを追加します。
サンプルコード(クリックでコピー)
Private Sub Test_SortMultiOption()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim so As Sort: Set so = ws.Sort
Dim sf As SortFields: Set sf = so.SortFields
Call sf.Clear
Call sf.Add2(ws.Range("B1"))
Call sf.Add2(ws.Range("E1"))
sf.Item(1).Order = xlAscending
sf.Item(2).Order = xlDescending
Call so.SetRange(ws.Range("A1:G10"))
so.Header = xlYes
Call so.Apply
End Sub
実行結果
上記サンプルコードを実行すると、B列の昇順、E列の降順で並び替えを実行します。
Sortメソッド
「WorkSheet」オブジェクトに「Sort」オブジェクトが追加されたExcel2007以前の並べ替えは、Rangeオブジェクトの「Sort」メソッドで実行することができました。現在もこの機能は使えるものの、並べ替えキーが3つしか設定できず実用性は低いです。
サンプルコード(クリックでコピー)
Private Sub Test_SortMethod()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets(1)
Dim rng As Range: Set rng = ws.Range("A1")
Call rng.Sort(Key1:=ws.Range("E1"), Order1:=xlAscending, Header:=xlNo)
End Sub
実行結果
上記サンプルコードは、セル「A1」が含まれる表をE列をキーにして、タイトル行を考慮せず、昇順で並べ替えます。
Comment