行の移動
「行を別の場所へ移す」「上下に並べ替える」「可視行だけ移動」「テーブル内で安全に移動」まで、初心者向けに最短コードと実務テンプレートで整理します。基本は 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