行の並べ替え(Sort)
Excelで「行を並べ替える」には Range.Sort を使います。VBAでは「どの列を基準に」「昇順か降順か」「見出しを含むか」を指定するのがポイントです。初心者向けに最短コードから応用例まで整理しました。
基本:1列を基準に昇順ソート
Sub Sort_Basic()
'表全体を取得(A1から連続領域)
Dim rg As Range
Set rg = Range("A1").CurrentRegion
'B列(Field:=2)を基準に昇順ソート
rg.Sort Key1:=rg.Columns(2), Order1:=xlAscending, Header:=xlYes
End Sub
VB- Key1: 並べ替え基準の列。
rg.Columns(2)は「表の2列目」=B列。 - Order1: 昇順なら
xlAscending、降順ならxlDescending。 - Header: 見出し行があるなら
xlYes、ないならxlNo。
降順ソート(例:金額の大きい順)
Sub Sort_Descending()
Dim rg As Range
Set rg = Range("A1").CurrentRegion
'E列(Field:=5)を基準に降順
rg.Sort Key1:=rg.Columns(5), Order1:=xlDescending, Header:=xlYes
End Sub
VB複数キーで並べ替え(例:部門→氏名)
Sub Sort_MultiKey()
Dim rg As Range
Set rg = Range("A1").CurrentRegion
rg.Sort _
Key1:=rg.Columns(2), Order1:=xlAscending, _ '部門列
Key2:=rg.Columns(3), Order2:=xlAscending, _ '氏名列
Header:=xlYes
End Sub
VB- Key2, Key3: 複数列を基準に並べ替え可能。
日付で並べ替え(古い順/新しい順)
Sub Sort_ByDate()
Dim rg As Range
Set rg = Range("A1").CurrentRegion
'D列の日付を古い順に
rg.Sort Key1:=rg.Columns(4), Order1:=xlAscending, Header:=xlYes
End Sub
VB部分範囲だけ並べ替え(例:データ部のみ)
Sub Sort_DataOnly()
Dim rg As Range
Dim last As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
'見出しを除いた A2:E最終行 を並べ替え
Set rg = Range("A2:E" & last)
rg.Sort Key1:=rg.Columns(2), Order1:=xlAscending, Header:=xlNo
End Sub
VBテーブル(ListObject)の並べ替え
Sub Sort_ListObject()
Dim lo As ListObject
Set lo = ActiveSheet.ListObjects("売上テーブル")
'金額列を降順に並べ替え
lo.Sort.SortFields.Clear
lo.Sort.SortFields.Add Key:=lo.ListColumns("金額").Range, _
SortOn:=xlSortOnValues, Order:=xlDescending
lo.Sort.Apply
End Sub
VB- ListObject.Sort: テーブルは専用の並べ替え機能を使う。
- 列名指定:
ListColumns("列名")で壊れにくい。
例題で練習
例題1:売上表を「部門→金額降順」で並べ替え
Sub Example_SortDeptAmount()
Dim rg As Range
Set rg = Range("A1").CurrentRegion
rg.Sort _
Key1:=rg.Columns(2), Order1:=xlAscending, _
Key2:=rg.Columns(5), Order2:=xlDescending, _
Header:=xlYes
End Sub
VB例題2:日付が新しい順に並べ替え、最新データを上に
Sub Example_SortNewestFirst()
Dim rg As Range
Set rg = Range("A1").CurrentRegion
rg.Sort Key1:=rg.Columns(4), Order1:=xlDescending, Header:=xlYes
End Sub
VB例題3:選択範囲だけを並べ替え(氏名昇順)
Sub Example_SortSelection()
If TypeName(Selection) = "Range" Then
Selection.Sort Key1:=Selection.Columns(1), Order1:=xlAscending, Header:=xlNo
End If
End Sub
VB実務の落とし穴と対策
- Header指定ミス: 見出し行があるのに
xlNoにすると見出しも並べ替え対象になる。必ず確認。 - 範囲指定のズレ: CurrentRegion は連続領域のみ。空白列があると途中で切れる。必要なら最終行・最終列を計算して範囲を組み立てる。
- 複数キーの順序: Key1→Key2→Key3 の順で優先度が決まる。
- テーブルと通常範囲の違い: テーブルは ListObject.Sort を使う。通常の Range.Sort では壊れることがある。
- 大量データ: 並べ替えは計算負荷が大きい。必要に応じて ScreenUpdating/Calculation をオフにして高速化。
Sub SpeedWrap_Sort()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'…並べ替え処理…
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
VB