データを複数の条件で並べ替える(Sort オブジェクトと SortFields.Add)

公開日:2026年10月7日 執筆:Takuya カテゴリ:データ集計・抽出

部署→日付→金額のように複数のキーで表を並べ替えるマクロです。Sort オブジェクトの SortFields.Add の書き方、見出し行の扱い、独自の順番での並べ替え、並べ替えで表が崩れる原因を解説します。

どんな場面で使うか

基幹システムから出力した明細を「支店ごと、その中で日付順、同じ日なら金額の大きい順」に並べてから印刷や確認に回す作業は、多くの職場で毎日のように行われています。手作業で並べ替えのダイアログを開き、条件を3つ設定するのは手間がかかるうえ、担当者によって順番が違うと、確認する側も見づらくなります。

並べ替えをマクロにしておけば、いつも同じ条件で一瞬で並べ替えられます。ほかの処理(抽出や小計の挿入など)の前処理としても使えます。

Sort オブジェクトの基本の流れ

現在の Excel では、ワークシートの Sort オブジェクトを使って並べ替えます。前回の条件が残っていることがあるため、最初に SortFields.Clear で条件を消してから、優先度の高い順に SortFields.Add でキーを追加します。最後に範囲や見出しの有無を指定して Apply で実行します。

  1. SortFields.Clear で前回の条件を消す
  2. SortFields.Add で優先順位の高いキーから追加する
  3. SetRange で並べ替える範囲(見出しを含む)を指定する
  4. Header = xlYes で1行目を見出しとして扱う
  5. Apply で実行する

コード(支店→日付→金額の3キー)

A列:伝票番号、B列:日付、C列:支店、D列:担当者、E列:金額の表を、支店(指定した順)→日付の昇順→金額の降順で並べ替えます。支店は五十音順ではなく、社内で決まった順番にしたいことが多いため、CustomOrder で順番を指定しています。

Sub SortMeisai()
    Dim ws As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim tbl As Range

    Set ws = ThisWorkbook.Worksheets("明細")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    If lastRow < 3 Then Exit Sub                    ' データが1件以下なら並べ替え不要

    Set tbl = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))   ' 見出しを含む表全体

    With ws.Sort
        .SortFields.Clear
        ' 第1キー:支店(社内で決めた順番)
        .SortFields.Add Key:=tbl.Columns(3), SortOn:=xlSortOnValues, _
            Order:=xlAscending, CustomOrder:="本店,東京支店,大阪支店,福岡支店"
        ' 第2キー:日付の古い順
        .SortFields.Add Key:=tbl.Columns(2), SortOn:=xlSortOnValues, Order:=xlAscending
        ' 第3キー:金額の大きい順
        .SortFields.Add Key:=tbl.Columns(5), SortOn:=xlSortOnValues, Order:=xlDescending
        .SetRange tbl
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .Apply
    End With
End Sub

コードのポイント

並べ替える範囲は、列の一部ではなく表全体を指定することが大切です。たとえば日付の列だけを範囲にすると、日付だけが並び替わり、ほかの列と行の対応が崩れてしまいます。この記事のコードでは、見出し行の最終列と A 列の最終行から表全体を求めています。

Header = xlYes を指定しないと、Excel が見出しの有無を自動で判定し、見出し行まで並べ替えの対象になる場合があります。見出しがある表では必ず明示します。CustomOrder に指定していない値(新しい支店など)は、指定した値の後ろに並びます。

並べ替えで結果がおかしくなる原因

日付や金額が文字列として入っていると、「10」が「9」より前に並ぶなど、数値として正しく並びません。CSV から取り込んだデータでよく起こるため、並べ替えの前に数値や日付に変換しておきます。セルの左上に緑の三角が表示されている場合は、文字列として保存された数値の可能性があります。

また、表の中に結合セルがあると「この操作には、同じサイズの結合セルが必要です」というエラーで止まります。並べ替える表では結合セルを使わず、見た目を整えたいときは「選択範囲内で中央」の配置で代用してください。

数式の中でほかの行を相対参照していると、並べ替え後に参照先がずれて計算結果が変わることがあります。並べ替えの前に値に変換するか、参照方法を見直してください。元の並び順に戻したい場合に備えて、連番の列を用意しておくと安心です。

  • 文字列の数値・日付は先に変換する
  • 結合セルがあると並べ替えできない
  • 元に戻せるよう連番の列を用意しておく

ほかの記事