データを複数の条件で並べ替える(Sort オブジェクトと SortFields.Add)
部署→日付→金額のように複数のキーで表を並べ替えるマクロです。Sort オブジェクトの SortFields.Add の書き方、見出し行の扱い、独自の順番での並べ替え、並べ替えで表が崩れる原因を解説します。
どんな場面で使うか
基幹システムから出力した明細を「支店ごと、その中で日付順、同じ日なら金額の大きい順」に並べてから印刷や確認に回す作業は、多くの職場で毎日のように行われています。手作業で並べ替えのダイアログを開き、条件を3つ設定するのは手間がかかるうえ、担当者によって順番が違うと、確認する側も見づらくなります。
並べ替えをマクロにしておけば、いつも同じ条件で一瞬で並べ替えられます。ほかの処理(抽出や小計の挿入など)の前処理としても使えます。
Sort オブジェクトの基本の流れ
現在の Excel では、ワークシートの Sort オブジェクトを使って並べ替えます。前回の条件が残っていることがあるため、最初に SortFields.Clear で条件を消してから、優先度の高い順に SortFields.Add でキーを追加します。最後に範囲や見出しの有無を指定して Apply で実行します。
- SortFields.Clear で前回の条件を消す
- SortFields.Add で優先順位の高いキーから追加する
- SetRange で並べ替える範囲(見出しを含む)を指定する
- Header = xlYes で1行目を見出しとして扱う
- 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 から取り込んだデータでよく起こるため、並べ替えの前に数値や日付に変換しておきます。セルの左上に緑の三角が表示されている場合は、文字列として保存された数値の可能性があります。
また、表の中に結合セルがあると「この操作には、同じサイズの結合セルが必要です」というエラーで止まります。並べ替える表では結合セルを使わず、見た目を整えたいときは「選択範囲内で中央」の配置で代用してください。
数式の中でほかの行を相対参照していると、並べ替え後に参照先がずれて計算結果が変わることがあります。並べ替えの前に値に変換するか、参照方法を見直してください。元の並び順に戻したい場合に備えて、連番の列を用意しておくと安心です。
- 文字列の数値・日付は先に変換する
- 結合セルがあると並べ替えできない
- 元に戻せるよう連番の列を用意しておく