Excel VBA 逆引き集 | 行の移動

Excel VBA
スポンサーリンク

行の移動

「行を別の場所へ移す」「上下に並べ替える」「可視行だけ移動」「テーブル内で安全に移動」まで、初心者向けに最短コードと実務テンプレートで整理します。基本は EntireRow を対象にして、Cut/Insert か Copy + PasteSpecial(値のみ)を使います。


基本:同一シートで行を移動(切り取り+挿入)

Sub MoveRow_CutInsert()
    '5行目を切り取り、10行目の“手前”に挿入(5行目は抜け、10行目が下へずれる)
    Rows(5).Cut
    Rows(10).Insert
End Sub
VB
  • ポイント:
    • Rows(n).Cut → Rows(m).Insert: “移動”の最短パターン。参照や書式も丸ごと移る。
    • 挿入位置: 指定行の「上」に入る。移動先周辺の行は下に押し下げられる。

他シートへ移動(切り取り+挿入)

Sub MoveRow_ToAnotherSheet()
    With Worksheets("Sheet1")
        .Rows(5).Cut
    End With
    Worksheets("Sheet2").Rows(8).Insert
End Sub
VB
  • ポイント:
    • 修飾を明示: どのシートの行かを明確に。
    • 別シートでも手順同じ: Cut→Insert で安全に移動。

「値だけ」移して元は残す(コピーして値貼り付け)

Sub MoveRow_ValuesOnly()
    '行の一部列(A:E)を行単位で移す。元は残す
    Range("A10:E10").Value = Range("A5:E5").Value
End Sub
VB
  • ポイント:
    • 値のみ: 数式・書式を持ち込みたくない場合に有効。
    • サイズ一致: 貼り先と貼り元は同じ列幅にする。

複数行をまとめて別の場所へ移動

Sub MoveRows_Block()
    '3〜7行を切り取り、20行目の手前へ一括移動
    Rows("3:7").Cut
    Rows(20).Insert
End Sub
VB
  • ポイント:
    • 連続範囲: “開始:終了”で複数行を一気に扱える。
    • 元の位置は詰まる: 移動元の下の行が上へ詰まることを理解しておく。

行を1つ上/下へ入れ替える(上下移動のテンプレート)

Sub MoveRow_UpOne()
    Dim r As Long: r = 10 '移動したい行
    If r > 1 Then
        Rows(r).Cut
        Rows(r - 1).Insert
    End If
End Sub

Sub MoveRow_DownOne()
    Dim r As Long: r = 10
    Rows(r + 1).Insert
    Rows(r).Cut
    Rows(r + 1).Insert
End Sub
VB
  • ポイント:
    • 上へ: Cut→上の行へ Insert。
    • 下へ: 先に“空き”を作ってから Insert すると分かりやすい。

フィルタ後の「表示中の行だけ」を移動

Sub Move_VisibleRowsOnly()
    Dim tbl As Range, vis As Range, c As Range
    Set tbl = Range("A1").CurrentRegion
    tbl.AutoFilter Field:=2, Criteria1:="=営業A"

    On Error Resume Next
    Set vis = tbl.Offset(1).Resize(tbl.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis.Cells
            '例:可視行をレポートシートの末尾へ移動(切り取り+挿入)
            Dim last As Long
            last = Worksheets("Report").Cells(Rows.Count, "A").End(xlUp).Row
            Rows(c.Row).Cut
            Worksheets("Report").Rows(last + 1).Insert
        Next
    End If
End Sub
VB
  • ポイント:
    • 1列に限定して可視セル取得: 行重複回避。Row番号で行単位処理。
    • 順序維持: 上から順に処理すると、元の表の行番号が変わる。可視行を別シートへ“追記”するならこのままでOK。表内で並べ替える場合は事前に対象行を収集してから安全に処理。

テーブル(ListObject)内で安全に移動

テーブルには“行の移動”メソッドがありません。基本は「行データを新規追加して、元行を削除」または「テーブル外へ切り取り→別位置へ挿入」で対応します。

Sub MoveRow_ListObject()
    Dim lo As ListObject, i As Long
    Set lo = ActiveSheet.ListObjects("売上テーブル")

    '例:金額>=30万の先頭行をテーブル末尾へ“移動”相当
    For i = 1 To lo.ListRows.Count
        With lo.ListRows(i).Range
            If .Columns(lo.ListColumns("金額").Index).Value >= 300000 Then
                '末尾へ新規行を追加して値をコピー(書式はテーブルに準拠)
                Dim newRow As ListRow
                Set newRow = lo.ListRows.Add
                newRow.Range.Value = .Value
                lo.ListRows(i).Delete
                Exit For
            End If
        End With
    Next
End Sub
VB
  • ポイント:
    • ListRows.Add→Delete: テーブル内“移動”の安全策。集計列・書式はテーブルの規則に自動適用される。
    • 列名基準: ListColumns(“列名”).Index で壊れにくい。

例題で練習

例題1:選択した行を指定行の直前へ移動

Sub Example_MoveSelectionToRow()
    If TypeName(Selection) = "Range" Then
        Dim src As Long, dst As Long
        src = Selection.Row
        dst = 15
        Rows(src).Cut
        Rows(dst).Insert
    End If
End Sub
VB

例題2:キー列Aが「緊急」の行を上部(見出し直下)へ集約移動

Sub Example_MoveUrgentToTop()
    Dim last As Long, r As Long, insertAt As Long
    insertAt = 2
    last = Cells(Rows.Count, "A").End(xlUp).Row
    For r = 2 To last
        If Cells(r, "A").Value = "緊急" Then
            Rows(r).Cut
            Rows(insertAt).Insert
            insertAt = insertAt + 1
        End If
    Next
End Sub
VB

例題3:行の一部列だけ、同じ行番号で別シートへ「値だけ」移動

Sub Example_MovePartialColumns_ValuesOnly()
    Dim r As Long: r = 12
    Worksheets("Out").Range("B" & r & ":E" & r).Value = _
        Worksheets("In").Range("B" & r & ":E" & r).Value
End Sub
VB

実務の落とし穴と対策

  • 参照ずれ・数式の影響: Cut/Insert はセル参照を連動させる。意図せず参照が変わるなら「値だけ移動」を選ぶか、移動後に再計算列を見直す。
  • フィルタ中の移動: 非表示行や可視行の扱いが混在すると崩れやすい。可視セル取得を使い、行番号で処理する。
  • 結合セル: 結合がある行の移動はレイアウトが乱れやすい。結合は避けるか事前に解除。
  • 大量移動の速度: まとめて範囲を Cut→Insert すると速い。行ごとのループが多い場合は ScreenUpdating/Calculation の制御で高速化。
Sub SpeedWrap_MoveRows()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    '…行の移動処理…

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB
タイトルとURLをコピーしました