Excel VBA 逆引き集 | 行の並べ替え(Sort)

Excel VBA
スポンサーリンク

行の並べ替え(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

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