行を削除
「指定行を消す」「複数行まとめて」「条件で削除」「空白行だけ」「フィルタ後の可視行だけ」など、初心者がつまずきやすい場面を、最短コードと安全テンプレートで整理します。基本は Rows(n).Delete、Range(…).EntireRow.Delete を使います。大量削除は「下からループ」が鉄則です。
基本:単一行・複数行を削除
Sub DeleteRow_Basic()
'3行目を削除
Rows(3).Delete
'A5セルを含む行を削除
Range("A5").EntireRow.Delete
'3〜5行をまとめて削除
Rows("3:5").Delete
End Sub
VB- ポイント:
- Rows(n).Delete: 行番号で直接削除。
- EntireRow.Delete: 任意セルや範囲から「その行」を削除。
- 連続範囲: “開始:終了” で複数行に対応。
動的最終行まで一気に削除(ヘッダーを残す)
Sub DeleteRows_FromSecondToLast()
Dim last As Long
last = Cells(Rows.Count, "A").End(xlUp).Row 'A列基準
If last >= 2 Then
Rows("2:" & last).Delete
End If
End Sub
VB- ポイント:
- 最終行取得: End(xlUp) で可変長の表に対応。
- 安全条件: データがあるときだけ削除。
条件付きで削除(値が一致・しきい値など)
Sub DeleteRows_ByCondition()
Dim last As Long, r As Long
last = Cells(Rows.Count, "E").End(xlUp).Row
'E列が「削除」と書かれた行を削除(下からが鉄則)
For r = last To 2 Step -1
If Cells(r, "E").Value = "削除" Then
Rows(r).Delete
End If
Next
End Sub
VB- ポイント:
- 下からループ: 削除で行番号が詰まるため、上からだと取りこぼしが起きる。
- 複数条件: AND/OR や Select Case で拡張可能。
空白行だけ削除(CountAで判定)
Sub DeleteBlankRows()
Dim last As Long, r As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For r = last To 2 Step -1
If WorksheetFunction.CountA(Rows(r)) = 0 Then
Rows(r).Delete
End If
Next
End Sub
VB- ポイント:
- CountA: その行に「何か入っているか」を簡単に判定できる。
- 対象範囲の限定: 必要なら Range(“B2:H” & last).Rows で表範囲に絞る。
フィルタ後の可視行だけ削除(非表示を残す)
Sub DeleteVisibleRowsOnly()
Dim vis As Range
On Error Resume Next
Set vis = Range("B2:B200").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not vis Is Nothing Then
vis.EntireRow.Delete
End If
End Sub
VB- ポイント:
- SpecialCells(xlCellTypeVisible): オートフィルタで表示中の行だけ抽出。
- エラー回避: 可視セルがない場合に備え、Nothingチェック。
重複行を削除(列Aを基準に重複を除去)
Sub DeleteDuplicates_ByColumnA()
Dim rng As Range
Set rng = Range("A2:A100")
rng.RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
VB- ポイント:
- RemoveDuplicates: 条件に合う「重複行」を一括で削除する高速な内蔵機能。
- 複数列基準: Columns:=Array(1,3) のように列指定を増やせる。
例題で練習
例題1:売上表で「金額が0」の行を削除
Sub Example_DeleteZeroAmount()
Dim last As Long, r As Long
last = Cells(Rows.Count, "E").End(xlUp).Row '金額=E列
For r = last To 2 Step -1
If Val(Cells(r, "E").Value) = 0 Then Rows(r).Delete
Next
End Sub
VB例題2:期限切れかつステータス「未」の行を削除
Sub Example_DeleteOverdueIncomplete()
Dim last As Long, r As Long
last = Cells(Rows.Count, "D").End(xlUp).Row '期限=D列
For r = last To 2 Step -1
If Cells(r, "D").Value < Date And Cells(r, "E").Value = "未" Then
Rows(r).Delete
End If
Next
End Sub
VB例題3:選択範囲に含まれる行を丸ごと削除(選択依存しない安全版)
Sub Example_DeleteSelectionRows()
If TypeName(Selection) = "Range" Then
Selection.EntireRow.Delete
End If
End Sub
VB実務の落とし穴と対策
- 上からのループで取りこぼし: 削除で行が詰まるため、必ず「最終行から逆順」で処理する。
- フィルタと削除の整合性: フィルタ後に「可視のみ」削除するなら SpecialCells を使用。非表示まで消したくない場合の必須テク。
- 結合セルで崩れ: 結合がある行の削除は予期せぬ影響が出る。結合を最小限にするか、解除してから実施。
- 誤削除のリスク: 実行前に範囲や条件を必ず確認。必要なら事前にバックアップを取る。
- 速度低下: 大量削除は画面更新や再計算で遅くなる。必要に応じて一時的に高速化する。
Sub SpeedWrap_Example()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'... 削除処理 ...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
VBテーブル(ListObject)の行削除
Sub DeleteRow_FromListObject()
Dim lo As ListObject, i As Long
Set lo = ActiveSheet.ListObjects("売上テーブル")
'金額が0の行をテーブル内で削除(下から)
For i = lo.ListRows.Count To 1 Step -1
If lo.ListRows(i).Range.Columns(lo.ListColumns("金額").Index).Value = 0 Then
lo.ListRows(i).Delete
End If
Next
End Sub
VB- ポイント:
- ListRows(i).Delete: テーブル構造を壊さず安全に削除。
- 列名指定: 見出し変更に強い。
