Excel VBAで特定行を移動する方法|2F・3Fデータを指定位置へ並べ替えるサンプルコード解説

Visual Basic

Excel VBAでは、更新される一覧データを条件に応じて並べ替えたり、特定の行だけ移動したい場面があります。特に部屋番号やフロア情報のように、単純なソートでは順番を維持できないケースでは、VBAによる行移動処理が有効です。この記事では、A列の文字列条件を判定し、「2F」で始まるデータを「2」または「R」で始まるデータ群の直下へ移動するVBA処理について解説します。

今回のデータ構造のポイント

今回のケースでは、A列にフロア情報を含む文字列が入力されています。

先頭文字 意味
2 / R 同じフロア
3 別フロア
2F / 3F 特殊データ

重要なのは、単純な昇順ソートを使うとD列など他列の並び順が壊れてしまう点です。

そのため、必要な行だけを移動するVBA処理が適しています。

実現したい処理の流れ

今回の処理内容を整理すると、以下のようになります。

  1. A列を上から確認
  2. 先頭が「2」または「R」の最終行を探す
  3. 先頭が「2F」の行を探す
  4. 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や他フロアにも応用しながら、条件付き整列を自動化していくと作業効率が大きく向上するでしょう。

コメント

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