Excelのデータをマクロで並び変えるSortメソッド、Sortオブジェクトのご紹介です。
ExcelにはVBAで並び変えする方法がいくつかあって、最初に紹介するSortメソッドは~2003までで主流な、古典的なやりかたです(普通に今でも使えます)。Rangeオブジェクトで範囲を指定し、その枠内で並べ替えします。
Sortメソッドの使い方
基本~優先列の指定
範囲.Sort(引数)


あとで見てわかりやすいよう、なるべく簡単に書きたいと思います。

(公式ページだと省略可能になってるので、バージョンによってはいけるのかもしれませんが)



Range("A1:B9").Sort Range("B1")
(A1~B9の表の中で、B列を優先して並べ替える)というような記述になります。B1はB9でもB1:B9でもいいです。



複数の優先列(Key1~3)


他にも「Key2」「Key3」が指定でき、1から3の順に優先して並べ替えが行われます。
フィールド名を指定して書く場合、フィールド名:=値のような書き方をします。
試しに
Range("A1:C9").Sort key1:=Range("A1"), key2:=Range("C1")
を実行してみましょう。



昇順/降順の指定(Order1~3)

一度フィールド名を消して、優先列の後にxlと打つと、ふたつ候補が表示されました。

値として入力したxlAscendingは昇順を意味します。



Range("A1:C9").Sort key1:=Range("A1"), order1:=xlDescending, key2:=Range("B1"), order2:=xlAscending
とし、A列を降順、B列を昇順で並べ替えてみます。
なお、Order(昇順/降順)は一度設定すると、変更しない限り次のSortでも同じ設定で実行されます。
昇順の場合も指定しておくのが無難です。
その他のSortメソッドの引数
とりあえず上までの内容を知ってれば大体対応できると思いますが、Sortメソッドには他にも大量に引数があります。
Key(優先列)およびOrder(昇順or降順)については書いたので、それ以外について順次加筆していきます。以下で紹介している引数は全て省略可能です。
範囲.Sort(Key1、 Order1、 Key2、 Type、 Order2、 Key3、 Order3、 Header、 OrderCustom、 MatchCase、 Orientation、 SortMethod、 DataOption1、 DataOption2、 DataOption3)
Type(ピボットテーブルにおける並べ替え方法の指定)

説明によると値で並べ替えをする時は、VBAではtype:=xlSortValuesとなり、対してラベルで並べ替えを指定する時は、VBAではtype:=xlSortLabelsとなるそうです。
ふたつ合わせてXlSortType列挙型定数と呼ばれます。

Header(見出しを並べ替え範囲に含めるか)

Header:=xlGuessの場合、Excelが見た感じから見出しをソート範囲に含めるべきかどうかを判定します。



今回はC列でソートしてますが、数字が大きいにも関わらず、一行目は見出しとして扱われるので元の位置に残ります。

一度変更すると、省略してもその後のソートにも設定が引き継がれるのでご注意ください(2007以降)。
OrderCustom(ユーザー設定リストの適用)
通常の昇順/降順以外に、特殊な並び順を適用したい場合はOrderCustomで指定します。



デフォルトで曜日とか、干支なんかが登録されています。



今回使うリストは上から数えていくと、


MatchCase(大文字小文字の区別)





デフォルトの値はFalseです(確認した記事)。
そうそう変更しない引数だと思いますが、一度変更すると、省略してもその後のソートにも設定が引き継がれます(2007以降)。
Orientation(横方向に並べ替え)




このふたつはどちらも同じ意味なので、好きなほうを使ってOKです。


このふたつも同じ意味です。

なお、この引数も変更結果が省略しても引き継がれます(2007以降)。
SortMethod(ふりがなを使うかどうか)


SortMethodも省略すると次回に引き継がれます(2007以降)。
DataOption1~3(テキストを数値データとして並べ替えるか)

値はXlSortTextAsNumbersと、XlSortNormalの二種類です(XlSortDataOption列挙型定数)。規定値はNormalのほうです。

そういうことをするのがXlSortTextAsNumbersで、

Sortオブジェクトの使い方
続いて、2007以降に追加されたSortオブジェクトの使い方です。
おおまかなイメージとしては、Sortメソッドが範囲.並べ替え 色々設定という書き方だったのに対し、Sortオブジェクトでは範囲の指定をまず行い、その後で指定した範囲に色々設定しながら実行という二段階の構成になっています。
Sortオブジェクトの取得


そしてWorkSheet.Sortはまとめて「ワークシートの並べ替え機能」という対象となり、これをSortオブジェクトと呼んでいます。
つまりSortオブジェクト=Sortプロパティのくっついた別のオブジェクトです。
ソートの実行(Apply)

ただしこの状態だと今いるワークシートをソートするとしか命令してないので、特に何も起きません。もっと詳細にソートする範囲などを指定していく必要があります。
ソート範囲の指定(SetRange)

ただし、これを実行してもまだダメです。Sortメソッド同様に、Keyを指定してやる必要があります。
ソートの優先順の指定(SortFields.Add、Key)

SortFieldsコレクションに対してAddメソッドを使うことで、SortオブジェクトにSortFieldオブジェクトを追加することができます。
細かいことは抜きにしても、とりあえず定型文として知ってれば使えます。


SortFields.Clearについて

字面からなんとなくわかる通り、SortFieldsコレクションをクリアしています。AddしたSortFieldオブジェクトは並べ替え実行後も保存されるため、後からAddしたSortFieldオブジェクトはその後に追加され、優先順位が低くなります(よって同じ引数を操作した場合、前回の設定で実行されます)。それを避けるための命令です。
というわけで、まずSortFields.Clearして、SetRangeで範囲を指定し、SortFields.Add Key:=で優先列の指定、Applyでソートの実行……という形がSortオブジェクトの実行最小単位になるかと思います。
※ワークシート全部ソートしていいなら、SetRangeなくても動きます。
' vba Sortオブジェクト基本形
Dim sorttest As Worksheet ' ソート対象のオブジェクトを指定
Set sorttest = ActiveSheet
With sorttest.Sort ' WorkSheetオブジェクトにSortをくっつける=Sortオブジェクト
.SortFields.Clear' 一度SortFieldsをまっさらにする
.SortFields.Add Key:=Range("A1") ' ソート優先順指定(上に書いたものほど優先)
.SortFields.Add Key:=Range("B1") ' ソート優先順指定(Key2相当)
.SetRange Range("A1:B5") ' ソート範囲指定
.Apply ' ソート実行
End With
その他のSortオブジェクトのプロパティ
Sortメソッドと共通するものが多いです。Sortオブジェクト(公式)のメソッドはApply(ソートの実行)とSetRange(範囲指定)、プロパティはSortFields、SortMethod、Header、MatchCase、Orientationなどがあり、さらにSortFieldsプロパティを付けた=SortFieldオブジェクト(公式)にAddなどのメソッド、プロパティがあるイメージです。
見出しを並べ替えに含むか(Header)

今回はプロパティなので、=の後に値を入力します。プロパティは値を保持するため、省略すると前回の設定になります(規定値:XlNo)。
Sortメソッドの引数で変更した場合も、2007以降では挙動としてSortオブジェクトのHeaderプロパティを変更しているため、値が保持されています。つまりSortオブジェクトのプロパティにあるものが、Sortメソッドの引数の中で値が保持されるものです。
アルファベットの大文字小文字を分別するか(MatchCase)

プロパティなので、省略すると前回の設定になります(規定値:False)。
縦横どちらにソートするか(Orientation)

プロパティなので、省略すると前回の設定になります(規定値:xlSortColumns)。
並べ替えにふりがなを使うか(SortMethod)

xlPinYinでふりがなに沿って並べ替え、xlStrokeで文字コードに沿って並べ変えとなります。
プロパティなので、省略すると前回の設定になります(規定値:xlPinYin)。
その他のSortFields.Addメソッドの引数(他)
SortFieldsは色んな種類のSortField(並べ替えフィールド)の集まり(コレクション)です。Sortオブジェクト.SortFieldsとすることでSortFieldsオブジェクトという「対象」を取得し、SortFieldsオブジェクトの中にその構成要素であるSortFieldを追加(Add)していくことができます。
ひらたく言えば並べ替え設定の追加です。先述の通り形として覚えてれば問題なく使えます。
Clearする前提なのでいちいち書きませんが、追加したSortFieldオブジェクトは並べ替え後も残るので、下記ひととおり何もしなければ前回の設定が残ります。
昇順/降順(Order)

Sortメソッドの時と同様、Keyと一緒にOrderで指定します(例ではオブジェクトSort.SortFields.Add Key:=Range(“A1”), Order:=xlAscending)。
xlAscending=昇順で並べ替えます。

ユーザー定義の並べ替え(CustomOrder)

画像の曜日指定をしたいとします。上から数えて2番目です。


CustomとOrderが前後逆になり、数字が-1されます(「新しいリスト」がカウントされなくなる)。


テキストを数値データで並べ替え(DataOption)

XlSortNormal(規定値)では文字列「001」と数字「1」は別のカテゴリとして並び変えされ、XlSortTextAsNumberでは文字列設定の数値も数値データとして並べ替えます。
色やアイコン基準で並べ替え(SortOn)

引数SortOnのあとにxlSortOn列挙型定数で指定します。規定値がxlSortOnValuesとなり、値での並べ替えを意味します。



SortOnの色優先度設定(SortOnValueプロパティ)
SortOnValueはSortFieldオブジェクトのプロパティで、ここで色の優先度の指定が可能です。


Keyでは列の優先度を指定していましたが、ここでは色の優先度を指定している形です。





' vba 色で並び変え
Dim sorttest As Worksheet
Set sorttest = ActiveSheet
With sorttest.Sort
.SortFields.Clear
' 薄い緑で塗ったセルが上に来るように並び変え(優先)
.SortFields.Add(Key:=Range("A1"), Order:=xlAscending, _
SortOn:=xlSortOnCellColor).SortOnValue.Color = RGB(146, 208, 80)
' フォントが赤いセルが下に来るように並び変え(2番目に優先)
.SortFields.Add(Key:=Range("A1"), Order:=xlDescending, _
SortOn:=xlSortOnFontColor).SortOnValue.Color = rgbRed
.SetRange Range("A1:A16")
.Apply
End With
SortOnのアイコン優先度設定(SetIconメソッド)





IconSets(1).Item(2)で実行すると、表のように横の矢印を優先する形で並び返されます。



' vba アイコンで並び変え
Dim sorttest As Worksheet
Set sorttest = ActiveSheet
With sorttest.Sort
.SortFields.Clear
' アイコンリストの1番上のセットのうち、2番目のアイコンを優先して並び変え
.SortFields.Add(Key:=Range("A1"), Order:=xlAscending, _
SortOn:=xlSortOnIcon).SetIcon Icon:=ActiveWorkbook.IconSets(1).Item(2)
.SetRange Range("A1:A16")
.Apply
End With


コメント