スポンサーリンク

【VBA】SortFieldsのClearを忘れてはならない理由

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でリセットするのが鉄則

コメント

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