Excelで並び替え(Sort)を行う際、意外とつまずきやすいのが「データ範囲に空白行が含まれているケース」です。実務でも、入力ミスやデータ整理の段階で空白行が混ざってしまうことはよくあります。その場合、VBAでSortを実行すると想定外の結果になることがあります。ここでは 空白行が含まれる場合の挙動と対処法 を詳しく解説します。
目次
1. Sort対象に空白行が含まれる場合の挙動
Excelの自動判定による「データ範囲の分断」
Excelは並び替えを行う際に、「連続しているセル範囲」をひとまとまりのデータとして認識します。
そのため、 空白行が途中にあると、データがそこで分断されたとみなされる ため、並び替えが意図通りに動作しないことがあります。
例)下記のようなデータを想定します。
ID | 名前 | 得点 |
---|---|---|
1 | 田中 | 80 |
2 | 鈴木 | 70 |
3 | 佐藤 | 90 |
4 | 高橋 | 60 |
この場合、Excelは「ID=1~2の範囲」と「ID=3~4の範囲」を別々のテーブルと認識します。その結果、ソートをかけても「全体をまとめて並べ替え」するのではなく、分断された範囲ごとに並び替えが行われます。
並び替え時の典型的なトラブル
- 一部しか並び替えられない
→ データの途中で止まってしまい、残りの行がそのままになる。 - ヘッダー行も並び替え対象に含まれる
→ 範囲が正しく認識されず、タイトル行がデータと混ざる。 - フィルタの設定範囲とずれる
→ AutoFilterを併用している場合、空白行があると絞り込みの対象が一部に限定される。
2. 対処法
空白行を含む場合に正しく並び替えを行うには、以下の方法があります。
(1) 並び替え範囲を明示的に指定する
VBAで Set rng = ws.Range("A1:C100")
のように 並び替え対象の範囲を明示的に指定 することで、空白行があっても全体を並び替えられます。
(2) CurrentRegionを過信しない
Range("A1").CurrentRegion
を使うと、空白行で途切れた範囲しか取得できません。
そのため、 空白行が存在する可能性がある場合は、CurrentRegionは避けるか、データ範囲を正しく計算して指定する ことが重要です。
(3) 空白行を事前に削除・詰める
根本的な対策としては、並び替え前に空白行を削除する、または SpecialCells(xlCellTypeBlanks)
を使ってデータを上に詰める方法があります。
3. 実務での注意点
- データを渡される際、無意識に空白行が混ざっているケースが多い
- VBAで自動処理を組むなら、 「範囲を指定する」or「空白行を削除する」処理をセットで書くのが安全
- フィルタとソートを組み合わせる場合は特に、空白行の存在が原因で「絞り込み範囲」と「並び替え範囲」がずれることが多い
4. まとめ
- 空白行があると、Excelはデータ範囲を分断して認識するため、意図通りにソートできない。
- VBAでは範囲を 明示的に指定する ことが最も確実。
- 可能であれば、並び替え前に 空白行を削除・詰める処理 を組み込むと、トラブルを未然に防げる。
コメント