Excel VBAで行を削除する方法をお探しですね。
広告
Excel VBAで行や列を削除・挿入する方法【条件一致で削除する実践コードも解説】
Excel VBAで行や列を削除・挿入できるようになると、毎月の集計表やCSV加工、不要データの整理がグッと楽になります。
特に「A列が空白の行を消したい」「ステータスが完了の行だけ削除したい」「指定した位置に列を追加したい」といった処理は、手作業だとミスしやすいですよね。
この記事では、Excel VBAで特定の行や列を削除・挿入する基本から、条件に合う行を削除する実践的な書き方、処理を安全かつ高速にするコツまで、わかりやすく解説していきます。
1. Excel VBAで行や列を削除・挿入する基本
Excel VBAで行や列を操作するときは、主に`Rows`、`Columns`、`Range`を使います。
行全体を削除するなら`Rows(5).Delete`、列全体を削除するなら`Columns(“C”).Delete`と書けばOKです。
挿入する場合は`Rows(5).Insert`や`Columns(“C”).Insert`を使います。
Excel上で右クリックして「削除」「挿入」を選ぶ操作を、VBAで命令していると考えるとわかりやすいですね。
ただし、削除や挿入は元に戻せない処理になりやすいので、実行前にファイルを保存するか、コピーしたシートで試すことをおすすめします。
まずは、指定した行や列を削除・挿入する最も基本的なコードを見てみましょう。
以下の例では、5行目を削除し、C列を削除し、さらに10行目とD列を挿入しています。
行番号や列記号を変えれば、好きな位置を対象にできますよ。
“`vba
Sub 行列の削除と挿入の基本()
‘5行目を削除
Rows(5).Delete
‘C列を削除
Columns(“C”).Delete
’10行目に新しい行を挿入
Rows(10).Insert
‘D列に新しい列を挿入
Columns(“D”).Insert
End Sub
“`
複数行や複数列をまとめて処理したい場合は、`Rows(“5:10”).Delete`や`Columns(“C:E”).Insert`のように範囲指定できます。
たとえば5行目から10行目までを削除したいときは、1行ずつ削除するよりもまとめて削除した方がコードも短く、処理も安定します。
ただし注意点があります。
削除や挿入を行うと、それ以降の行番号や列位置がずれるんです。
たとえば5行目を削除すると、元の6行目が新しい5行目になります。
この「位置がずれる」という性質が、条件に合う行を削除するときの重要なポイントになります。
“`vba
Sub 複数行列をまとめて操作()
‘5行目から10行目を削除
Rows(“5:10”).Delete
‘C列からE列を挿入
Columns(“C:E”).Insert
End Sub
“`
挿入するときには、セルの書式や数式の参照が引き継がれることがあります。
たとえば既存の表の途中に行を追加すると、上下の書式が自動的に適用されるケースがあるんです。
これは便利な反面、意図しない書式や数式が入る原因にもなります。
業務用のマクロでは、挿入後に`ClearFormats`で書式を消したり、必要な見出しや数式を明示的に設定したりすると、処理結果が安定しますよ。
2. 条件一致で特定の行を削除する方法
条件に合う行を削除する処理では、「どの列を見て判定するか」と「どの方向にループするか」が大事です。
たとえばA列に「削除」と入力されている行だけを削除したい場合、A列の最終行まで確認して、条件に合った行を削除します。
ここで重要なのが、**上から下へ削除すると、削除後に行番号が詰まって、次の行を飛ばしてしまう**ことがあるんです。
そのため、行削除では基本的に最終行から先頭行へ向かって処理します。
これはVBAで条件一致削除を行う際の定番ルールです。
以下は、A列の値が「削除」の行を削除する基本コードです。
`Cells(Rows.Count, “A”).End(xlUp).Row`は、A列の最終データ行を取得する書き方です。
データ件数が毎回変わる表でも、最終行を自動で判定できるので、実務でよく使われます。
“`vba
Sub 条件一致で行を削除()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
‘A列の最終行を取得
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
‘下から上へ処理する
For i = lastRow To 2 Step -1
If ws.Cells(i, “A”).Value = “削除” Then
ws.Rows(i).Delete
End If
Next i
End Sub
“`
このコードでは、2行目から下を対象にしています。
1行目に見出しがある表では、見出し行を削除しないように`For i = lastRow To 2 Step -1`としています。
もし見出しがないデータなら、`To 1`に変更してください。
条件は完全一致だけじゃなく、空白行、特定文字を含む行、数値が一定以下の行などにも応用できます。
たとえばB列が空白の行を削除するなら`If ws.Cells(i, “B”).Value = “” Then`、C列に「完了」を含む行を削除するなら`If InStr(ws.Cells(i, “C”).Value, “完了”) > 0 Then`のように書きます。
条件が複数ある場合は、`And`や`Or`を使います。
たとえばA列が「削除」かつD列が「完了」の行だけ削除するなら、`If ws.Cells(i, “A”).Value = “削除” And ws.Cells(i, “D”).Value = “完了” Then`とします。
反対に、A列が「削除」または「不要」のどちらかなら削除したい場合は`Or`を使います。
業務データでは全角・半角の違いや前後のスペースが原因で一致しないこともあるので、必要に応じて`Trim`で余分なスペースを除去してから比較すると、想定外の取りこぼしを減らせますよ。
“`vba
Sub 複数条件で行を削除()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
For i = lastRow To 2 Step -1
If Trim(ws.Cells(i, “A”).Value) = “削除” _
Or Trim(ws.Cells(i, “A”).Value) = “不要” Then
ws.Rows(i).Delete
End If
Next i
End Sub
“`
大量データを扱う場合、1行ずつ削除すると処理に時間がかかることがあります。
その場合は、削除対象の行を`Union`でまとめてから最後に一括削除する方法もあります。
ただし、対象行が非常に多い場合は`Union`自体が重くなるケースもあるので、数千行程度の通常業務では下からループ、数万行以上ではオートフィルターや配列処理を検討するといいですね。
まずは下から削除する基本形を覚えて、処理速度が問題になったときに改善する順番が安全です。
3. 特定の列を削除・挿入する方法と見出し名で判定する実践例
列を削除・挿入する場合も、基本は`Columns(“C”).Delete`や`Columns(3).Insert`で実行できます。
ただし、業務データでは列の位置が毎回同じとは限りませんよね。
たとえばCSVの出力形式が変わって、「備考」列がC列ではなくE列に移動することがあります。
このような場合、列番号を固定して削除すると、誤って別の列を消してしまう危険があります。
実務では、**見出し名を探して該当する列を削除・挿入する書き方**にしておくと、表の構造変化に強いマクロになります。
以下は、1行目の見出しから「備考」という列を探して、その列を削除するコードです。
`Find`メソッドは、指定した範囲から条件に一致するセルを探す機能です。
見つかった場合は`target.Column`で列番号を取得して、その列全体を削除します。
見つからなかった場合にエラーにならないよう、`If Not target Is Nothing Then`で確認している点も重要です。
“`vba
Sub 見出し名で列を削除()
Dim ws As Worksheet
Dim target As Range
Set ws = ActiveSheet
Set target = ws.Rows(1).Find(What:=”備考”, LookAt:=xlWhole)
If Not target Is Nothing Then
ws.Columns(target.Column).Delete
Else
MsgBox “「備考」列が見つかりませんでした。
”
End If
End Sub
“`
列を挿入する場合も、見出し名を基準にできます。
たとえば「金額」列の右側に「税込金額」列を追加したい場合は、「金額」を探して、その右隣に列を挿入します。
列を挿入した後は、見出し名を設定したり、必要に応じて数式を入力したりします。
このように、単に列を追加するだけでなく、追加後の見出しや計算式までVBAに含めると、手作業をさらに減らせますよ。
“`vba
Sub 見出し名の右に列を挿入()
Dim ws As Worksheet
Dim target As Range
Dim insertCol As Long
Set ws = ActiveSheet
Set target = ws.Rows(1).Find(What:=”金額”, LookAt:=xlWhole)
If Not target Is Nothing Then
insertCol = target.Column + 1
ws.Columns(insertCol).Insert
ws.Cells(1, insertCol).Value = “税込金額”
Else
MsgBox “「金額」列が見つかりませんでした。
”
End If
End Sub
“`
複数の列を条件で削除する場合は、**右から左へ処理する**のが基本です。
行削除と同じく、列を削除すると右側の列が左へ詰まるので、左から削除すると列を飛ばす可能性があります。
たとえば1行目の見出しが空白の列を削除する場合は、最終列から1列目へ向かって確認します。
最終列は`Cells(1, Columns.Count).End(xlToLeft).Column`で取得できます。
**行は下から、列は右から**と覚えておくとミスを防ぎやすくなりますよ。
“`vba
Sub 見出しが空白の列を削除()
Dim ws As Worksheet
Dim lastCol As Long
Dim c As Long
Set ws = ActiveSheet
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
For c = lastCol To 1 Step -1
If Trim(ws.Cells(1, c).Value) = “” Then
ws.Columns(c).Delete
End If
Next c
End Sub
“`
4. 削除・挿入マクロを安全に動かす注意点と高速化のコツ
行や列の削除・挿入は、Excel VBAの中でも影響範囲が大きい処理です。
セルの値だけでなく、数式の参照、グラフの元データ、テーブル範囲、ピボットテーブル、条件付き書式にも影響することがあります。
特に共有ファイルや保護されたワークシートでは、削除や挿入が許可されていないとエラーになります。
シート保護中にマクロで行列を操作する場合は、処理前に`Unprotect`で保護を解除して、処理後に`Protect`で再保護する設計にしましょう。
パスワードを使う場合は、コード管理にも注意が必要です。
“`vba
Sub 保護シートで行削除する例()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Unprotect Password:=”pass”
‘例:5行目を削除
ws.Rows(5).Delete
ws.Protect Password:=”pass”
End Sub
“`
処理速度を上げたい場合は、画面更新や自動計算を一時的に停止します。
行削除を何度も実行すると、そのたびに画面描画や数式再計算が走って、処理が遅くなるためです。
`Application.ScreenUpdating = False`で画面更新を止めて、`Application.Calculation = xlCalculationManual`で自動計算を手動に切り替えると、体感速度が大きく改善することがあります。
ただし、処理の最後には必ず元に戻す必要があります。
エラーが起きても設定を戻せるように、実務ではエラー処理を入れておくと安心ですね。
“`vba
Sub 高速化して条件一致行を削除()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
On Error GoTo Finally
Set ws = ActiveSheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
For i = lastRow To 2 Step -1
If ws.Cells(i, “A”).Value = “削除” Then
ws.Rows(i).Delete
End If
Next i
Finally:
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
“`
マクロを安全に運用するためには、いきなり本番データに実行しないことも大切です。
削除処理は元データを失う可能性があるので、最初はコピーしたブックでテストして、対象列、開始行、条件式が正しいかを確認しましょう。
また、`ActiveSheet`に依存すると、別のシートを開いた状態で実行したときに誤操作が起きる場合があります。
業務用のコードでは、`Worksheets(“データ”)`のようにシート名を明示する方が安全です。
さらに、削除対象の件数を事前に数えてメッセージ表示する設計にすれば、利用者が処理内容を確認してから実行できます。
最後に、条件一致で削除する処理は「**下から上へ**」、列削除は「**右から左へ**」、対象範囲は「**最終行・最終列を取得して可変にする**」という3点を押さえると安定します。
単純な`Rows.Delete`や`Columns.Insert`だけでも便利ですが、見出し名で列を探す、条件式を明確にする、保護シートや高速化に対応することで、実務で使えるマクロになります。
Excel VBAで特定の行や列を削除・挿入する方法を身につければ、データ整形や帳票作成の作業時間を大きく減らせますよ。
まずは小さなサンプル表で動作を確認して、問題なく動くことを確認してから実データに適用してみてくださいね。
広告
