ES000012_VBAエキスパート(ExcelVBAスタンダード)合格講座/第十二回:並べ替え

VBAエキスパート(ExcelVBAスタンダード)合格講座/第十二回:並べ替え ExcelVBA Standard

このページの内容について

このページは、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オブジェクトを追加しただけでは、まだ並び替えキーは設定されません。これは手動で並び替えを実行する場合に、実際に並び替えを実行するまでは並び替えキーが保存されないことと同じ動作です。

引数役割
KeyRangeキーに指定したい列(行)に含まれるセル
SortOnVariant(XlSortOn)xlSortOnValues  ・・ 値での並び替え
xlSortOnCellColor ・・ 背景色での並び替え
xlSortOnFontColor ・・ 文字色での並び替え
xlSortOnIcon ・・ 条件付き書式のアイコンでの並び替え
OrderVariant(XlSortOrder)xlAscending ・・ 昇順
xlDescending ・・ 降順
CustomOrderVariantユーザー設定の並べ替え
DataOptionVariant(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の並べ替えの画面を開くと、まだキーが追加されていません。また、省略可能な引数をすべて省略しているため、並び替え条件が保存されているプロパティにはすべて既定値が入力されています。

「Add」と「Add2」の違いは2018年10月18日にアップデートされたExcelのデータ型である「株式型」と「地理型」を並べ替え条件に設定できるか否かです。「Add2」メソッドは「Add」メソッドの上位互換機能であるため、古いバージョンのExcelでの動作を想定しない限りは「Add2」メソッドを使用します。

並べ替えの実行(Sortオブジェクト)

並べ替えキーの設定が完了したあとは、並べ替えの範囲などを設定し、並べ替えを実行します。

SetRangeメソッド

並び替えの範囲はSortオブジェクトの「SetRange」メソッドを使用します。範囲を指定しただけでは、まだ並び替えは実行されません。

引数役割
RngRange並び替えの範囲を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列の降順で表を並び替えます。

「Order」プロパティのデフォルトは「昇順」です。

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列の文字列形式の数値を数値とみなして並べ替えを実行します。

「DataOption」プロパティのデフォルトは「xlNormal(数値とテキスト形式の数値を分けて並び替えを行う)」です。

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行目をタイトル行とみなして並び替えを実行します。

「Header」プロパティのデフォルトは「xlGuess(Excelがヘッダーと認識する行・列を並べ替えない)」です。

複数の並べ替えキーを設定する

複数の並べ替えキーを設定するには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列をキーにして、タイトル行を考慮せず、昇順で並べ替えます。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment