Excel VBAでは、更新される一覧データを条件に応じて並べ替えたり、特定の行だけ移動したい場面があります。特に部屋番号やフロア情報のように、単純なソートでは順番を維持できないケースでは、VBAによる行移動処理が有効です。この記事では、A列の文字列条件を判定し、「2F」で始まるデータを「2」または「R」で始まるデータ群の直下へ移動するVBA処理について解説します。
今回のデータ構造のポイント
今回のケースでは、A列にフロア情報を含む文字列が入力されています。
| 先頭文字 | 意味 |
|---|---|
| 2 / R | 同じフロア |
| 3 | 別フロア |
| 2F / 3F | 特殊データ |
重要なのは、単純な昇順ソートを使うとD列など他列の並び順が壊れてしまう点です。
そのため、必要な行だけを移動するVBA処理が適しています。
実現したい処理の流れ
今回の処理内容を整理すると、以下のようになります。
- A列を上から確認
- 先頭が「2」または「R」の最終行を探す
- 先頭が「2F」の行を探す
- 2F行を2/Rグループ直下へ移動
例えば以下のような並びがあった場合です。
| 移動前 | 移動後 |
|---|---|
| 2xxx Rxxx 3xxx 2Fxxx |
2xxx Rxxx 2Fxxx 3xxx |
このように、条件付きで行位置を変更します。
VBAサンプルコード
以下のコードで実現できます。
Sub Move2FRow()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim insertRow As Long
Dim moveRow As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
insertRow = 0
moveRow = 0
For i = 5 To lastRow
If Left(ws.Cells(i, "A").Value, 1) = "2" Or _
Left(ws.Cells(i, "A").Value, 1) = "R" Then
If Left(ws.Cells(i, "A").Value, 2) <> "2F" Then
insertRow = i
End If
End If
If Left(ws.Cells(i, "A").Value, 2) = "2F" Then
moveRow = i
End If
Next i
If insertRow > 0 And moveRow > 0 Then
ws.Range(ws.Cells(moveRow, 1), ws.Cells(moveRow, 6)).Cut
ws.Rows(insertRow + 1).Insert Shift:=xlDown
Application.CutCopyMode = False
End If
End Sub
このコードではA列から条件を判定し、A~F列までをまとめて移動しています。
コードの重要ポイント
特に重要なのは以下の部分です。
| 処理 | 内容 |
|---|---|
| Left関数 | 文字列先頭を判定 |
| Cut | 行データを切り取り |
| Insert | 指定位置へ挿入 |
ソートを使わずに移動だけ行うため、他列の並び順を維持できます。
これは業務データで非常に重要なポイントです。
2Fが存在しない場合の対策
実際のデータでは、「2F」が存在しない場合もあります。
今回のコードでは、以下条件で安全に処理しています。
If insertRow > 0 And moveRow > 0 Then
これにより、対象データが無い場合は何も実行されません。
エラー停止を防げるため、毎日更新されるデータにも向いています。
3Fにも対応したい場合
同じ考え方で、「3F」を「3」で始まる行の下へ移動することも可能です。
例えば条件部分を変更すれば応用できます。
- 2F → 3F
- 2/R → 3
業務データの階層整理では、このような条件分岐を増やしていくケースが多いです。
処理速度を上げるコツ
データ量が増える場合は、画面更新停止を追加すると高速化できます。
Application.ScreenUpdating = False
処理終了時には以下を戻します。
Application.ScreenUpdating = True
数千行規模になると、体感速度がかなり変わります。
まとめ
Excel VBAでは、単純なソートでは対応できない「条件付き行移動」を柔軟に実現できます。今回のように、2Fデータを2/Rグループ直下へ移動する場合も、A列の文字列判定とCut・Insertを組み合わせることで対応可能です。特に他列の順序を壊したくない業務データでは、VBAによる個別移動処理が非常に有効です。今後は3Fや他フロアにも応用しながら、条件付き整列を自動化していくと作業効率が大きく向上するでしょう。


コメント