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 する
