Range.Sortメソッドとは
Excelでデータを並べ替える操作は、手動なら「データ」タブの「並べ替え」機能で行いますが、VBAからはRangeオブジェクトのSortメソッドを使うことで自動化できます。
Range.Sortは、単一キーでの並べ替えはもちろん、複数キーを組み合わせた並べ替えや、昇順・降順の混在にも対応できる汎用性の高いメソッドです。この記事では、Range.Sortメソッドの基本的な使い方から、複数キーでの並べ替え、注意点までを実際に動作するサンプルコードとともに解説します。
単一キーで並べ替える基本形
まずは、A列を基準に昇順で並べ替える最もシンプルな例です。
Sub SortSingleKey()
Dim targetRange As Range
Set targetRange = Sheet1.Range("A1:C100")
targetRange.Sort _
Key1:=Sheet1.Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
Key1:並べ替えの基準にする列(見出し行と同じ行のセルを指定します)Order1:xlAscending(昇順)またはxlDescending(降順)Header:先頭行が見出し行かどうか。xlYesにすると見出し行は並べ替え対象から除外されます
Header:=xlYesを指定し忘れると見出し行までデータとして並べ替えられてしまうため、表に見出しがある場合は必ず指定しましょう。
複数キーで並べ替える
Key1に加えてKey2、Key3を指定すると、複数の列を基準にした並べ替えができます。例えば「部署ごとにグループ化した上で、売上が高い順に並べる」といった処理です。
Sub SortMultipleKeys()
Dim targetRange As Range
Set targetRange = Sheet1.Range("A1:C100")
targetRange.Sort _
Key1:=Sheet1.Range("A1"), Order1:=xlAscending, _
Key2:=Sheet1.Range("C1"), Order2:=xlDescending, _
Header:=xlYes
End Sub
このコードでは、まずA列(部署名など)で昇順に並べ、A列の値が同じ行同士はC列(売上など)で降順に並べ替えます。Key1が優先され、Key1が同じ値のときにKey2が効くという優先順位になります。Range.Sortでは最大3つのキー(Key1〜Key3)まで直接指定できます。
Sortオブジェクトで4つ以上のキーを指定する
4つ以上のキーで並べ替えたい場合は、Range.Sortの引数だけでは対応できません。その場合はWorksheet.Sort(SortFieldsコレクション)を使います。
Sub SortWithSortFields()
Dim targetRange As Range
Set targetRange = Sheet1.Range("A1:D100")
With Sheet1.Sort
.SortFields.Clear
.SortFields.Add Key:=Sheet1.Range("A1"), Order:=xlAscending
.SortFields.Add Key:=Sheet1.Range("B1"), Order:=xlAscending
.SortFields.Add Key:=Sheet1.Range("C1"), Order:=xlDescending
.SortFields.Add Key:=Sheet1.Range("D1"), Order:=xlAscending
.SetRange targetRange
.Header = xlYes
.Apply
End With
End Sub
SortFields.Clearで前回の設定をリセットしてから、SortFields.Addでキーを追加していく書き方です。キーの数に制限がなく、条件を後から追加・削除しやすいのがメリットです。表の列数が多く、並べ替え条件が複雑になりそうな場合はこちらの書き方がおすすめです。
表全体を自動で認識して並べ替える
並べ替え範囲を固定のセル番地で指定すると、データの行数が変わったときに範囲がずれてしまいます。CurrentRegionプロパティを使うと、表の範囲を自動で認識させられます。
Sub SortCurrentRegion()
Dim tbl As Range
Set tbl = Sheet1.Range("A1").CurrentRegion
tbl.Sort _
Key1:=Sheet1.Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
CurrentRegionは、指定したセルを含む「空白行・空白列で区切られた連続データの範囲」を自動判定してくれます。データ件数が日々増減する表でも、範囲指定を書き直す必要がなくなります。
五十音順・ふりがな順に並べ替える
日本語の文字列を並べ替える場合、SortMethod引数で「ふりがな順(発音順)」と「文字コード順」を切り替えられます。
Sub SortByPhonetic()
Dim targetRange As Range
Set targetRange = Sheet1.Range("A1:B100")
targetRange.Sort _
Key1:=Sheet1.Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes, _
SortMethod:=xlPinYin
End Sub
SortMethod:=xlPinYinはふりがな情報を使った五十音順、SortMethod:=xlStrokeは文字コード順(画数順ではなく文字コード基準の並び)です。氏名や商品名など、五十音順で揃えたいデータではxlPinYinを指定すると、見た目通りの順番になりやすくなります。
注意点
- 見出し行の指定を忘れない:
Header:=xlYesを指定し忘れると、見出し行まで並べ替え対象になってしまいます。 - 並べ替え範囲に結合セルが含まれるとエラーになる:結合セルが範囲内にあると
Range.Sortは実行時エラーになります。事前に結合を解除してから並べ替えを行いましょう。 - 数式が入ったセルは参照がずれる可能性がある:並べ替え対象の列に相対参照の数式が入っていると、行の移動によって参照先がずれることがあります。値としてまとめておくか、絶対参照にしておくと安全です。
- SortFieldsは都度Clearする:
Worksheet.Sortを使い回す場合、SortFields.Clearをしないと前回の条件が残ったまま蓄積されてしまいます。
まとめ
Range.Sortメソッドを使ったExcel VBAでの並べ替え自動化について解説しました。
- 単一キーの並べ替えは
Key1・Order1・Headerを指定するだけ - 複数キー(最大3つ)は
Key1〜Key3で優先順位付きの並べ替えができる - 4つ以上のキーが必要な場合は
SortFieldsコレクションを使う CurrentRegionを使えば表の範囲変化にも自動対応できる- 日本語の五十音順で並べたい場合は
SortMethod:=xlPinYinを指定する
手動での並べ替えは件数が多いほど手間がかかりますが、Range.Sortをマクロ化しておけばボタン一つで毎回同じ条件で並べ替えられます。日次・月次の集計作業を効率化したい場合にぜひ活用してください。


コメント