【ExcelVBA・マクロ】Range.Sortメソッド完全ガイド|複数キーでの並べ替えを自動化する方法【コピペOK】

ExcelVBA

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:並べ替えの基準にする列(見出し行と同じ行のセルを指定します)
  • Order1xlAscending(昇順)またはxlDescending(降順)
  • Header:先頭行が見出し行かどうか。xlYesにすると見出し行は並べ替え対象から除外されます

Header:=xlYesを指定し忘れると見出し行までデータとして並べ替えられてしまうため、表に見出しがある場合は必ず指定しましょう。

複数キーで並べ替える

Key1に加えてKey2Key3を指定すると、複数の列を基準にした並べ替えができます。例えば「部署ごとにグループ化した上で、売上が高い順に並べる」といった処理です。

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つのキー(Key1Key3)まで直接指定できます。

Sortオブジェクトで4つ以上のキーを指定する

4つ以上のキーで並べ替えたい場合は、Range.Sortの引数だけでは対応できません。その場合はWorksheet.SortSortFieldsコレクション)を使います。

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での並べ替え自動化について解説しました。

  • 単一キーの並べ替えはKey1Order1Headerを指定するだけ
  • 複数キー(最大3つ)はKey1Key3で優先順位付きの並べ替えができる
  • 4つ以上のキーが必要な場合はSortFieldsコレクションを使う
  • CurrentRegionを使えば表の範囲変化にも自動対応できる
  • 日本語の五十音順で並べたい場合はSortMethod:=xlPinYinを指定する

手動での並べ替えは件数が多いほど手間がかかりますが、Range.Sortをマクロ化しておけばボタン一つで毎回同じ条件で並べ替えられます。日次・月次の集計作業を効率化したい場合にぜひ活用してください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました