Excel VBAでソートを実行する際に重要なポイントのひとつが、.SortFields.Clear
を毎回実行することです。
これを忘れると、過去に設定したソート条件が残り、意図しない並び替えが起こる可能性があります。
以下では、その理由と具体的な対応方法を詳しく解説します。
1. SortFieldsとは?
SortFields
とは、並び替え条件を保持するオブジェクトです。
例えば「A列を昇順」「B列を降順」といった条件を複数保持できます。
条件を追加するたびに、SortFields.Add
で順番に格納されていきます。
.SortFields.Add Key:=Range("A2:A20"), Order:=xlAscending
.SortFields.Add Key:=Range("B2:B20"), Order:=xlDescending
この場合、まず「A列で昇順」し、その後「B列で降順」という複数条件ソートになります。
2. Clearを忘れるとどうなる?
.SortFields.Clear
を忘れて新しいソートを実行すると、前に設定した条件が残ったまま新しい条件が追加されてしまいます。
例
1回目の並び替えで「A列を昇順」に設定
2回目の並び替えで「B列を昇順」を指定(Clearを忘れた)
👉 この場合、実際には「A列昇順 + B列昇順」の2条件ソートになり、意図しない結果になります。
3. Clearを使う正しい書き方
正しくは、ソートを開始する前に毎回 .SortFields.Clear
を入れて、古い条件をリセットしてから新しい条件を追加します。
Sub ソート条件を正しく初期化する例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws.Sort
'古いソート条件をクリア
.SortFields.Clear
'新しい条件を追加(B列を昇順)
.SortFields.Add Key:=ws.Range("B2:B20"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'対象範囲を指定
.SetRange ws.Range("A1:C20")
'1行目を見出しとして扱う
.Header = xlYes
'並び替え実行
.Apply
End With
End Sub
4. 実務でのトラブル事例
- 意図せず複数条件になってしまう
→ 「前回の条件が残っている」ことが原因 - 並び替えがうまくいかない
→ Clearを入れ忘れてソートが複雑化しているケースが多い - 他人が作ったマクロで予期しない並び替えが起きる
→ Clearが無いコードは要注意
5. まとめ
SortFields
は 並び替え条件の履歴を保持する.SortFields.Clear
を入れないと 古い条件が残って意図しないソートになる- 実務では必ず ソート開始前にClearでリセットするのが鉄則
コメント