Excel VBAを使って表のデータを並び替える際、タイトル行まで並び替えられてしまう問題に直面することがあります。本記事では、タイトル行を維持しつつ、M列の色順、A列降順、B列降順で並び替える正しい方法を解説します。
タイトル行を維持しつつ並び替えを行うポイント
並び替えを適切に行うためには、以下のポイントを押さえる必要があります。
- タイトル行(1行目)を範囲から除外する
- ソート範囲を正しく設定する
- VBAのSortメソッドを適切に使用する
修正後のVBAコード
以下のVBAコードを使用することで、タイトル行を保持しつつ正しく並び替えができます。
Sub 並び替え()
Dim ws As Worksheet
Dim rng As Range
Set ws = ActiveSheet
' データ範囲の設定(2行目以降)
Set rng = ws.Range("A2").CurrentRegion
Set rng = rng.Offset(1, 0).Resize(rng.Rows.Count - 1) ' 1行目(タイトル)を除外
' 並び替えの設定
With ws.Sort
.SortFields.Clear
' M列を色順で並び替え
.SortFields.Add Key:=ws.Range("M3"), SortOn:=xlSortOnCellColor, SortOnValue.Color = RGB(255, 0, 0)
.SortFields.Add Key:=ws.Range("M3"), SortOn:=xlSortOnCellColor, SortOnValue.Color = RGB(226, 107, 10)
' A列を降順
.SortFields.Add Key:=ws.Range("A3"), Order:=xlDescending
' B列を降順
.SortFields.Add Key:=ws.Range("B3"), Order:=xlDescending
' 並び替え範囲を設定し適用
.SetRange rng
.Header = xlNo ' 2行目以降を対象
.Apply
End With
End Sub
修正ポイントの詳細解説
1. タイトル行を除外する
VBAの CurrentRegion
を使うと、データ全体を自動で選択します。しかし、タイトル行まで含まれてしまうため、Offset(1,0)
を使って2行目以降を対象にしました。
Set rng = rng.Offset(1, 0).Resize(rng.Rows.Count - 1)
これにより、タイトル行を除外し、2行目からデータ範囲を取得できます。
2. ソート範囲の適切な設定
並び替えを適用する範囲を正しく設定することが重要です。修正後のコードでは、並び替え範囲を .SetRange rng
で適用し、タイトル行を含めないようにしています。
3. .Header = xlNo を設定
デフォルトでは .Header = xlGuess
になっており、Excelが自動判定してしまうため、意図しない結果になることがあります。明示的に .Header = xlNo
を指定することで、2行目以降をデータとして処理できます。
まとめ
VBAで表を並び替える際に、タイトル行を保持しつつ正しく並び替えを行うには、以下の点に注意する必要があります。
- データ範囲を正しく設定し、タイトル行を除外する
- 適切なソート範囲を指定する
- 並び替えの際に
.Header = xlNo
を指定する
今回の修正コードを活用すれば、M列を色順、A列降順、B列降順で正しく並び替えることができます。ぜひ試してみてください。
コメント