Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Sort

Excel VBA VBA
スポンサーリンク

Sort は「表の行を“並べ替える”ための仕組みをコードで操作するもの」

まずイメージから。
Sort は、表の行を「昇順」「降順」などのルールで並べ替えるための機能です。
普段、リボンの「並べ替え」ボタンでやっていることを、VBA でやるのが Range.Sort(または Range.Sort オブジェクト)です。

大事なポイントは次の3つです。

どの範囲を「表」として並べ替えるか
どの列を基準に並べ替えるか
昇順か降順か

この3つをセットで考えられるようになると、Sort は一気に怖くなくなります。


一番基本:Range.Sort を使って「1列だけ」で並べ替える

A1:D10 の表を「C列の昇順」で並べ替える

まずは、シンプルな書き方から。

Sub SampleSortBasic()

    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets("入力")

    ' ヘッダー付きの表全体
    Set rng = ws.Range("A1:D10")

    ' C列(3列目)を基準に昇順で並べ替え
    rng.Sort Key1:=rng.Columns(3), Order1:=xlAscending, Header:=xlYes

End Sub
VB

ここでやっていることを分解します。

rng は「表全体の範囲」。ヘッダー行(項目名)を含めます。
Key1:=rng.Columns(3) は「表の中の3列目(C列)を並べ替えのキーにする」という意味です。
Order1:=xlAscending は「昇順(小さい→大きい、あ→ん)」です。
Header:=xlYes は「rng の1行目はヘッダー(項目名)だから並べ替え対象から除外してね」という指定です。

ここでの超重要ポイントは、「Key1 に“表の中の列”を渡す」という感覚です。
rng.Columns(3) と書くことで、「この表の3列目」を明示しています。


Sort の基本パラメータをしっかり押さえる

Key1(どの列を基準に並べ替えるか)

Key1:=rng.Columns(3) のように書きます。
ここでの 3 は、「rng の左から数えて3番目の列」です。

もし表が B2:E100 なら、

rng.Columns(1) → B列
rng.Columns(2) → C列
rng.Columns(3) → D列
rng.Columns(4) → E列

という対応になります。

「シートの列番号」ではなく、「表の中での列番号」で考えるのがコツです。

Order1(昇順か降順か)

Order1:=xlAscending → 昇順(小さい→大きい、あ→ん)
Order1:=xlDescending → 降順(大きい→小さい、ん→あ)

数字なら小さい順・大きい順、文字ならあいうえお順・逆順、日付なら古い順・新しい順、というイメージです。

Header(ヘッダー行があるかどうか)

Header:=xlYes → 範囲の1行目はヘッダー(項目名)として扱い、並べ替え対象から除外する
Header:=xlNo → ヘッダーなし。範囲の1行目から全部並べ替える

ヘッダー付きの表なら、基本的に Header:=xlYes を指定します。
これを忘れると、項目名の行まで一緒に動いてしまうので注意です。


もう一歩:Sort オブジェクトを使った「きちんとした書き方」

Sort オブジェクトで書く基本形

Excel の「ちゃんとした」書き方は、Range.Sort オブジェクトを使う形です。

Sub SampleSortObject()

    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets("入力")
    Set rng = ws.Range("A1:D10")   ' ヘッダー付きの表

    With rng.Sort
        .SortFields.Clear
        .SortFields.Add Key:=rng.Columns(3), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortNormal

        .SetRange rng
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .Apply
    End With

End Sub
VB

少し長く見えますが、やっていることはこうです。

SortFields.Clear
→ 以前の並べ替え条件をクリアする

SortFields.Add …
→ 「どの列を、どんなルールで並べ替えるか」を追加する

SetRange rng
→ 並べ替え対象の範囲(表全体)を指定する

Header = xlYes
→ 1行目はヘッダー

Orientation = xlTopToBottom
→ 上から下に向かって並べ替える(行単位)

Apply
→ 実際に並べ替えを実行する

最初は「引数が多くてしんどい」と感じるかもしれませんが、
「SortFields.Add で条件を積み上げて、最後に Apply で実行」という流れだけ掴めばOKです。


複数キーでの並べ替え(第1キー、第2キー…)

例:C列(ステータス)で昇順 → D列(金額)で降順

「まずステータス順、その中で金額の大きい順」みたいな並べ替えも、Sort なら簡単にできます。

Sub SampleSortMultiKey()

    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets("入力")
    Set rng = ws.Range("A1:D20")

    With rng.Sort
        .SortFields.Clear

        ' 第1キー:C列(ステータス)昇順
        .SortFields.Add Key:=rng.Columns(3), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortNormal

        ' 第2キー:D列(金額)降順
        .SortFields.Add Key:=rng.Columns(4), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlDescending, _
                        DataOption:=xlSortNormal

        .SetRange rng
        .Header = xlYes
        .Orientation = xlTopToBottom
        .Apply
    End With

End Sub
VB

ポイントは、

SortFields.Add を複数回呼ぶことで、「第1キー」「第2キー」…を順番に追加している
上から追加した順に優先される(最初が第1キー、その次が第2キー)

ということです。


Sort を使うときに意識してほしい重要ポイント

「並べ替え対象の範囲」を必ず“表全体”にする

並べ替えで一番やってはいけないのは、「一部の列だけ並べ替える」ことです。
例えば、C列だけを並べ替えると、行の対応関係が崩れてしまいます。

必ず、

ヘッダー行を含む「表全体」を Range として指定する
その Range に対して Sort をかける

という形にしてください。

悪い例:

ws.Range("C2:C10").Sort Key1:=ws.Range("C2"), Order1:=xlAscending
VB

良い例:

Set rng = ws.Range("A1:D10")   ' 表全体
rng.Sort Key1:=rng.Columns(3), Order1:=xlAscending, Header:=xlYes
VB

「行は“1行丸ごと”で動く」という意識がとても大事です。

「どのシートの、どの表を、どの列で並べ替えているか」を明示する

避けたい書き方の例です。

Range("A1:D10").Sort Key1:=Range("C1"), Order1:=xlAscending
VB

これは「アクティブなシートの A1:D10」を前提にしているので、
シートが変わると意図しない表を並べ替えてしまうリスクがあります。

超初心者のうちから、あえてこう書く癖をつけてください。

ThisWorkbook.Worksheets("入力").Range("A1:D10").Sort _
    Key1:=ThisWorkbook.Worksheets("入力").Range("C1"), _
    Order1:=xlAscending, Header:=xlYes
VB

あるいは変数を使って、もっと読みやすく:

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1:D10")

rng.Sort Key1:=rng.Columns(3), Order1:=xlAscending, Header:=xlYes
VB

「どのブック → どのシート → どの範囲(表) → どの列 → どんな順番」
という順番を崩さない書き方は、Sort でもかなり効いてきます。


まとめ:Sort は「表の行を“ルール通りに並べ替える”ためのメソッド」

Sort の本質は、

「ヘッダー付きの表(Range)に対して、“どの列をどんな順番で並べ替えるか”を指定し、行全体を並べ替える」

ことです。

押さえておきたいポイントをコンパクトにまとめると、

表全体(ヘッダー含む)を Range として握り、その Range に対して Sort をかける
Key1:=rng.Columns(n) で「表の中の n 列目」を並べ替えキーにする
Order1 で昇順・降順、Header でヘッダーの有無を必ず指定する
複数キーの並べ替えは SortFields.Add を複数回呼んでから Apply する

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