Excel VBA 逆引き集 | 行を削除

Excel VBA
スポンサーリンク

行を削除

「指定行を消す」「複数行まとめて」「条件で削除」「空白行だけ」「フィルタ後の可視行だけ」など、初心者がつまずきやすい場面を、最短コードと安全テンプレートで整理します。基本は 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: テーブル構造を壊さず安全に削除。
    • 列名指定: 見出し変更に強い。
タイトルとURLをコピーしました