Excelで大量のデータを扱っていると、「特定の条件に合う行だけ削除したい」「空白行を一括で削除したい」といった場面が出てきます。こうした作業を手作業で行うのは非常に効率が悪く、ミスも起こりがちです。そこで便利なのが、Excel VBA(マクロ)による自動処理です。本記事では、VBAを使って行を削除する基本的な方法から、条件付き削除や複数行の一括削除といった応用テクニックまで、実例を交えてわかりやすく解説します。VBA初心者の方にも理解しやすいように構成していますので、ぜひ参考にしてください。
VBAで行を削除するもっとも基本的な書き方は、Rows
オブジェクトやRange
オブジェクトのDelete
メソッドを使う方法です。以下のようなコードで任意の行を削除することができます。
Sub DeleteRow()
Rows(3).Delete
End Sub
このコードは、3行目を削除するシンプルなマクロです。また、Range
を使っても同様のことができます。
Sub DeleteRowByRange()
Range("A5").EntireRow.Delete
End Sub
このように、対象のセル範囲に対してEntireRow.Delete
を指定することで、そのセルが含まれる行全体を削除できます。
実務では「ある列の値が特定の値だった場合に行を削除したい」というケースが多くあります。たとえば、列Aに「削除」という文字が含まれる行を削除する例を見てみましょう。
Sub DeleteRowsWithCondition()
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 1 Step -1
If Cells(i, 1).Value = "削除" Then
Rows(i).Delete
End If
Next i
End Sub
このコードでは、ループを下から上へ処理しています。上から削除していくと、削除した瞬間に行の番号がずれてしまい、思ったように動かないことがあるためです。
データ処理の中で、空白行を削除したいという場面も頻繁にあります。以下のコードは、列Aが空白の行をすべて削除するマクロです。
Sub DeleteBlankRows()
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 1 Step -1
If Trim(Cells(i, 1).Value) = "" Then
Rows(i).Delete
End If
Next i
End Sub
Trim
関数を使うことで、スペースしか入力されていない場合も空白として認識できます。
オートフィルターを使って特定の条件で絞り込んだ後、その表示されている行だけを削除する方法もあります。
Sub DeleteFilteredRows()
Dim ws As Worksheet
Set ws = ActiveSheet
With ws
.Range("A1").AutoFilter Field:=1, Criteria1:="削除"
.Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).EntireRow.Delete
.AutoFilterMode = False
End With
End Sub
この方法のポイントは、SpecialCells(xlCellTypeVisible)
を使ってフィルター表示されている行だけを対象にしている点です。
複数条件で行を削除したい場合、条件を組み合わせてIf
文を工夫する必要があります。例えば、「列Aが空白、かつ列Bが0の場合に削除する」といった例です。
Sub DeleteRowsMultipleConditions()
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastRow To 1 Step -1
If Trim(Cells(i, 1).Value) = "" And Cells(i, 2).Value = 0 Then
Rows(i).Delete
End If
Next i
End Sub
条件の数が多くなる場合は、処理の見通しを良くするために、別関数として条件式だけ切り出すこともおすすめです。
行削除のマクロでよくあるトラブルとその対策をまとめておきます。
On Error Resume Next
や If Not rng Is Nothing Then
で対策する.AutoFilterMode = False
を入れてリセットVBAで行削除を行うと、基本的には「元に戻す」ができません。そのため、実行前にはブックを保存するか、バックアップを作成することが重要です。特に一括削除マクロでは、意図しない削除が発生することもあるため、事前対策を習慣にしましょう。
Sub SaveBackup()
Dim path As String
path = ThisWorkbook.Path & "\" & "Backup_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsm"
ThisWorkbook.SaveCopyAs path
MsgBox "バックアップを作成しました: " & path
End Sub
このようにして、削除マクロを実行する前にワンクリックでバックアップできる仕組みを作っておくと安心です。
VBAで行を削除する方法は多岐に渡りますが、基本となるDelete
メソッドを正しく使いこなすことが第一歩です。単一行の削除から、条件付き削除、空白行やフィルター活用による削除など、実務で役立つパターンはさまざまあります。本記事のコード例を自分のExcelシートに応じて少しずつアレンジしていくことで、VBAの理解も深まっていくはずです。
作業効率化の第一歩として、ぜひVBAでの行削除テクニックをマスターしてください。