Excel VBAでデータを並び替える際に使用する SortFields
には、上限が64列まで という制約があります。
大量のデータを扱う場合、この制約を理解していないと「思った通りにソートできない」「エラーになる」といったトラブルにつながります。
ここでは、SortFieldsの上限仕様と回避方法についてわかりやすく解説します。
目次
1. SortFieldsの上限は64列まで
基本構文のおさらい
複数列で並び替えを行う場合は、以下のように SortFields.Add
を繰り返し使います。
Sub 複数列の並び替え()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws.Sort
.SortFields.Clear
'第1キー:A列昇順
.SortFields.Add Key:=ws.Range("A2:A100"), Order:=xlAscending
'第2キー:B列昇順
.SortFields.Add Key:=ws.Range("B2:B100"), Order:=xlAscending
'第3キー:C列降順
.SortFields.Add Key:=ws.Range("C2:C100"), Order:=xlDescending
'並び替え対象範囲を指定
.SetRange ws.Range("A1:C100")
.Header = xlYes
.Apply
End With
End Sub
上記のように列を追加していくことで「第1キー → 第2キー → 第3キー…」の優先順位で並び替えられます。
制限:最大64列まで
SortFields
に追加できるキーは 最大64列まで- 65列目以降を追加しようとすると、エラーは出ない場合もありますが、無視されて適用されない ことがあります
つまり、Excel VBAでは「65列以上の条件での並び替えはできない」と理解しておく必要があります。
実務での影響
- 数百列にわたる大規模なデータ(BIツールからのエクスポートや統計データなど)を扱う場合
- 多段階の優先順位でソートを設計している場合
→ 「なぜか並び替えが思い通りに効かない」といった問題が起こりやすくなります。
2. 制約を回避する方法
方法①:優先順位を見直す
本当に64列も必要かを考えるのが第一歩です。
多くの場合、「主要な3〜5列」だけで十分に意味のある並び替えができます。
方法②:複数回に分けてソートする
どうしても多くの列で整列したい場合は、ソート処理を複数回に分けて実行します。
例:まず前半の列でソート → その後に後半の列で再度ソート
Sub ソートを複数回に分ける()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
'最初の32列でソート
With ws.Sort
.SortFields.Clear
'ここで32列分のSortFields.Addを追加
.SetRange ws.Range("A1:AH100")
.Header = xlYes
.Apply
End With
'次の32列でソート
With ws.Sort
.SortFields.Clear
'ここでさらに32列分のSortFields.Addを追加
.SetRange ws.Range("A1:AH100")
.Header = xlYes
.Apply
End With
End Sub
このように分割して行えば、64列以上の並び替えが必要なケースにも対応できます。
方法③:数式やヘルパー列を使う
複数列の並び替え条件を 補助列(ヘルパー列)にまとめる のも実務では有効です。
例えば「部署+担当者+日付」を1列に結合して、その列をソートキーにすれば処理をシンプルにできます。
3. まとめ
- SortFieldsには最大64列までの制限がある
- 65列目以降は無視されるため、思い通りの並び替えにならない
- 解決策は
- 優先順位を絞る
- 複数回に分けてソートする
- ヘルパー列を使って条件をまとめる
👉 大規模データを扱う場合、この制限を知っておくとトラブルを防げます。
コメント