セルを並べ替えるとき、Excel 2003までは
RangeオブジェクトのSortメソッド を使いました。たとえば、次のように。
Sub Sample1()
''C列を基準に昇順で並べ替えます
Range("A1:C10").Sort Key1:=Range("C2"), Order1:=xlAscending, Header:=xlYes
End Sub
同じ操作を、Excel 2007でマクロ記録すると、次のようなコードが記録されます。
Sub Macro1()
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A2:C10")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Excel 2007では、新しく
Sortオブジェクト が新設されました。また、Sortオブジェクト内に
SortFieldオブジェクト というのもあります。ザックリ言うと、Sortオブジェクトは「
並べ替えに関する 」オブジェクトで、SortFieldオブジェクトは「
並べ替えの条件に関する 」オブジェクトです。手順としては、
まず、並べ替えの条件を指定する → SortFieldオブジェクト
次に、その条件で並べ替えを実行する → Sortオブジェクト
という感じです。マクロ記録で記録されたコードは、次のようになっています。
SortFieldオブジェクトに並べ替えの条件を指定する
SortFieldオブジェクトから見ていきましょう。まず、マクロ記録されたコードを、少し編集します。並べ替えたいデータは[Sheet1]に入力してありますが、これはアクティブシートです。そこで、次のようにします。
Sub Macro1()
ActiveSheet .Sort.SortFields .Clear
ActiveSheet .Sort.SortFields .Add Key:=Range("C2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End Sub
SortFieldsコレクション は、SortFieldオブジェクトの集合体です。SortFieldオブジェクトは、1つの「並べ替え条件」に該当します。つまり、次のような関係です。もし3つの条件を指定したなら
新しい並べ替え条件(SortFieldオブジェクト)を設定する前に、それまでの並べ替え条件をクリアします。
ActiveSheet.Sort.SortFields .Clear
クリアしないと、それまでの並べ替え条件に、新しい条件が追加されます。
次に、新しい並べ替え条件を指定します。ここで指定しているのは「C列を基準に昇順」という条件です。見やすくするため、引数の指定ごとに改行します。
ActiveSheet.Sort.SortFields .Add _
Key :=Range("C2"), _
SortOn :=xlSortOnValues, _
Order :=xlAscending, _
DataOption :=xlSortNormal
並べ替え条件として指定できる引数は次の通りです。
引数名
必須/省略
説明
Key
必須
並べ替えの基準セル
SortOn
省略可
並べ替えのタイプ
Order
省略可
並べ替えの順序
CustomOrder
省略可
ユーザー設定の並べ替え基準
DataOption
省略可
数値と文字列の並べ替え基準
引数「SortOn」は、Excel 2007で追加された引数です。
何で並べ替えるか を指定します。引数「SortOn」には次の定数を指定できます。
定数
数値
意味
既定値
xlSortOnValues
0
セル内のデータで並べ替え
←これ
xlSortOnCellColor
1
セルの背景色で並べ替え
xlSortOnFontColor
2
セルの文字色で並べ替え
xlSortOnIcon
3
条件付き書式のアイコンで並べ替え
引数「SortOn」を省略すると、定数xlSortOnValues(数値で並べ替え)が指定されたものとみなします。
引数「Order」は、並べ替えの
昇順/降順 を指定します。引数「Order」には次の定数を指定できます。
定数
数値
意味
既定値
xlAscending
1
昇順
←これ
xlDescending
2
降順
引数「CustomOrder」は、
ユーザー設定の並べ替え基準 を使うとき、その基準を指定します。これは、Excel 2003までの引数「OrderCustom」と似ていますが、さらに便利になっています。
たとえばExcel 2003で、独自の基準でデータを並べ替えたいときは、次のようにします。ここでは「東京, 神奈川, 千葉」という並べ替え基準を指定するとします。
1.まず、ユーザー設定リストに「東京, 神奈川, 千葉」を登録します
2.データの並べ替えを実行します
3.[オプション]を開いて、1.で登録したユーザー設定リストを選択します
4.指定した基準で並べ替えが行われます
この操作をマクロ記録すると、次のようなコードが記録されます。
Sub Macro1()
Range("A1:B10").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=13 , MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal
End Sub
このように、Excel 2003までで
ユーザー設定の並べ替え基準 を使うときは、まずユーザー設定リストに登録して、引数OrderCustomには「ユーザー設定リストの何番目」と指定します。もちろん、ユーザー設定リストに登録されていない基準で並べ替えることはできません。
対して、Excel 2007の引数「CustomOrder」は、独自の並べ替え基準を
文字列 で指定します。
ActiveSheet.Sort.SortFields.Add _
Key:=Range("A2"), _
Order:=xlAscending, _
CustomOrder:="東京,神奈川,千葉" , _
DataOption:=xlSortNormal
ユーザー設定リストに登録する必要はありません。並べ替えを実行するたびに、自由な並べ替え基準を指定できます。
引数「DataOption」は、並べ替えの基準となるデータに、
数値と文字列が混在 しているときの並べ替え方法を指定します。引数「DataOption」には次の定数を指定できます。
定数
数値
意味
既定値
xlSortNormal
0
数値と文字列を別々に並べ替えます
←これ
xlSortTextAsNumbers
1
文字列を数値とみなして並べ替えます
まぁ、これを指定することは少ないでしょうね。たとえば、同じ列に、数値の「100」「200」と文字列の「'100」「'200」が入力されているとき、この列を並べ替えた結果を「100」「200」「'100」「'200」とするのか、それとも「100」「'100」「200」「'200」とするのかを決める設定です。そもそも、Excelにこういう設定があるということすら、あまり知られていません。下のダイアログボックス、見たことないでしょ?
最も簡素な並べ替え基準
並べ替えの基準となるSortFieldオブジェクトを追加するとき、以下の引数を指定できますが
引数名
必須/省略
説明
Key
必須
並べ替えの基準セル
SortOn
省略可
並べ替えのタイプ
Order
省略可
並べ替えの順序
CustomOrder
省略可
ユーザー設定の並べ替え順序
DataOption
省略可
数値と文字列の並べ替え基準
もし、セルの背景色や条件付き書式のアイコンなどではなく、
セル内のデータ を基準に並べ替えるのなら、引数SortOnは省略できます。また、データを
昇順 で並べ替えるのなら、引数Orderも省略可能です。さらに、
ユーザー設定の並べ替え基準 を使わない、データ内に
数値と文字列は混在 していない、というのなら、引数CustomOrderと引数DataOptionも省略できます。
ActiveSheet.Sort.SortFields .Clear
ActiveSheet.Sort.SortFields .Add Key:=Range("C2")
あるいは、
With ActiveSheet.Sort.SortFields
.Clear
.Add Key:=Range("C2")
End With
もちろん、必要な設定は引数に指定してくださいね。