【2026年7月最新】VBAで行・列を削除・クリアする完全ガイド|Delete・Clear・条件付き削除・重複行削除・逆順ループまで実践コード集

【2026年7月最新】VBAで行・列を削除・クリアする完全ガイド|Delete・Clear・条件付き削除・重複行削除・逆順ループまで実践コード集

「不要な行を一括削除したい」「VBAで行を削除するとインデックスがずれてしまう」「ClearとDeleteの違いが分からない」——VBAで行・列の削除とクリアを実装する際によく起きる問題です。

この記事では、Rows.Delete・Columns.Delete・Clear・ClearContentsの基本から、複数行削除で必須の逆順ループ・条件付き行削除・重複行削除・空白行削除まで、実務でそのまま使える実践コードとともに解説します。

代表菅澤 代表菅澤
「特定の文字が入っている行を全部削除したい」というのは、Excelの定型業務でよく発生する作業です。手作業だと1時間かかる削除処理が、VBAマクロを使えば数秒で完了します。この記事のコードをコピーして使えば、VBAを書いたことがない方でも即日使えます。
AI鬼管理山崎 AI鬼管理山崎
VBA行削除でハマりやすいのが「ループ中に行を削除するとインデックスがずれる」問題です。これを回避するための「逆順ループ(最終行から先頭に向かってループ)」は、VBA実務の必須テクニックです。この記事ではその理由と回避策を図解で説明します。
✔️Rows.Delete・EntireRow.Deleteで単一行・複数行を削除できる
✔️逆順ループ(Step -1)が複数行削除で必須な理由が理解できる
✔️Clear・ClearContents・ClearFormatsの違いを使い分けられる
✔️条件付き行削除(特定の値を含む行を自動削除)のコードが書ける
✔️RemoveDuplicatesで重複行を一括削除できる
✔️空白行・空白列の一括削除の実践コードが手に入る
✔️Claude CodeでVBA削除処理を日本語指示で自動生成できる
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBAで行・列を削除・クリアする完全ガイド|Delete・Clear・条件付き削除・重複行削除・逆順ループまで実践コード集
VBAで行・列を削除・クリアする方法を完全解説。Rows.Delete・Clear・ClearContents・逆順ループ必須の理由・条件付き行削除・重複行RemoveDuplicates・空白行削除まで実践コード付きで解説します。

01 VBAで行を削除する基本メソッド(Rows.Delete・EntireRow.Delete) 単一行・範囲指定・セル基準の3種類の行削除コードを使い分ける

VBAで行を削除するには主に2つのアプローチがあります。Rows()で行番号を直接指定する方法と、Range().EntireRowでセルを起点に行全体を取得する方法です。

📚 用語解説

Deleteメソッド(VBA):Excelの行・列・セルを削除するVBAメソッド。「Rows(3).Delete」で3行目を削除します。Deleteを実行すると行全体が削除され、下の行が上に詰まります(上にシフト)。これが「行番号のずれ」の原因になるため、複数行削除時は後述の逆順ループが必要です。

Sub DeleteRowBasic() '--- 方法1: 行番号で1行削除 --- Rows(3).Delete '3行目を削除 '--- 方法2: 行範囲で複数行を一括削除 --- Rows("3:5").Delete '3〜5行目を一括削除 '--- 方法3: セル基準で行全体を削除(行番号を知らなくてもOK)--- Range("B5").EntireRow.Delete 'B5セルが含まれる行(5行目)を削除 End Sub

1-2. Deleteメソッドのシフト方向を指定する

DeleteメソッドにはShift引数があり、削除後のセルの移動方向を指定できます。行削除では通常xlShiftUp(上方向シフト)を使いますが、明示的に指定することで意図を明確にできます。

Sub DeleteRowWithShift() 'xlShiftUp: 下の行が上に詰まる(行削除の標準動作) Rows(3).Delete Shift:=xlShiftUp 'xlShiftToLeft: 右の列が左に詰まる(セル削除で使用) Range("B3").Delete Shift:=xlShiftToLeft End Sub

02 VBAで列を削除する基本メソッド(Columns.Delete・EntireColumn.Delete) 列番号・列記号・セル基準の3種類の列削除コードを解説

列の削除も行削除と同じ構造です。Columns()で列番号または列記号("A"〜"Z")を指定するか、Range().EntireColumnでセルを起点に列全体を取得します。

📚 用語解説

EntireColumn / EntireRow(VBA):Rangeオブジェクトのプロパティで、指定したセルが属する列全体・行全体のRangeを返します。「Range("C5").EntireColumn」はC列全体(C:C)と同じ範囲を指します。セル参照をコードに直接書かず、変数で管理している場合に特に便利です。

Sub DeleteColumnBasic() '--- 方法1: 列番号(数値)で削除 --- Columns(3).Delete '3列目(C列)を削除 '--- 方法2: 列記号(英字)で削除 --- Columns("C").Delete 'C列を削除(上と同じ結果) '--- 方法3: 列範囲で複数列を一括削除 --- Columns("B:D").Delete 'B〜D列を一括削除 '--- 方法4: セル基準で列全体を削除 --- Range("C5").EntireColumn.Delete 'C5が含まれるC列を削除 End Sub

03 複数行・列の削除で必須の「逆順ループ」とは 順方向ループで行が1つずつスキップされる原因と逆順ループによる解決策

VBAで「条件に一致する行を順番にループして削除する」コードを書くと、行が1つおきにしか削除されないバグに遭遇することがあります。これはDeleteで行が詰まることによる「インデックスずれ」が原因です。

⚠️順方向ループで行削除すると1行おきに削除が漏れる

For i = 1 To 10 の順方向ループで3行目を削除すると、元の4行目が3行目に移動します。次にi=4を処理しようとすると、元の5行目を見てしまい、元の4行目(現在の3行目)をスキップしてしまいます。これが「1行おきに削除が漏れる」バグの原因です。

順方向ループ(NG)
行3削除→行4が行3に移動→i=4で元の行5を処理→元の行4をスキップ
問題発生
削除が1行おきに漏れる
逆順ループ(OK)
最終行から先頭に向かって削除→上の行インデックスは変わらない
正しく全行削除
Step -1で完全動作
'--- NG例: 順方向ループ(削除が漏れる) --- Sub DeleteRows_NG() Dim i As Long For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row '先頭から If Cells(i, 1).Value = "削除" Then Rows(i).Delete '削除後に次の行が上に詰まりスキップが発生! End If Next i End Sub '--- OK例: 逆順ループ(Step -1で最終行から先頭へ)--- Sub DeleteRows_OK() 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
💡最終行の取得方法(Cells(Rows.Count, 1).End(xlUp).Row)

「Cells(Rows.Count, 1).End(xlUp).Row」はVBAで最終行番号を取得するイディオムです。「Rows.Count」でExcelの最大行数(1,048,576)を取得し、そこからCtrl+Upキーと同じ動作(xlUp)でデータがある最後の行に移動します。A列にデータがない場合は他の列番号に変更してください(例: Cells(Rows.Count, 2).End(xlUp).Row でB列基準)。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Clear・ClearContents・ClearFormatsの違いと使い分け 「値だけ消したい」「書式だけ残したい」ケース別の選択基準

行・列の「削除(Delete)」は行・列そのものを取り除く操作ですが、「クリア(Clear系)」はセルの位置は残したまま内容だけを消去します。Clear系メソッドは3種類あり、何を消すかで使い分けます。

📚 用語解説

ClearContents(クリアコンテンツ):VBAでセル・行・列の「値と数式だけ」を消去するメソッド。書式(色・フォント・罫線等)はそのまま残ります。テンプレートの入力欄をリセットするときなど、書式を保持しながら値だけ消したい場合に使います。「Rows(3).ClearContents」で3行目の値だけを消去します。

メソッド消去対象残るもの使いどころ
Clear全てを消去何も残らないセルを完全リセット(書式も不要)
ClearContents値・数式のみ書式(色・罫線・フォント)が残るテンプレートの入力欄リセット
ClearFormats書式のみ値・数式が残るデータはそのままで見た目をリセット
ClearCommentsコメントのみ値・書式が残るコメントだけ一括削除
Sub ClearSamples() '--- Clear: 値も書式も全て消す --- Rows("3:5").Clear '3〜5行目を完全クリア Columns("B:D").Clear 'B〜D列を完全クリア '--- ClearContents: 値だけ消す(書式は残す)--- Rows(3).ClearContents '3行目の値だけ消す Range("A1:Z100").ClearContents '範囲内の値を一括クリア '--- ClearFormats: 書式だけ消す(値は残す)--- Rows(3).ClearFormats '3行目の書式だけ消す End Sub

05 条件付き行削除(特定の値を含む行を自動削除) InStr・条件比較・複数条件のOr/And検索を使った実践削除コード

実務でよく使うのが「特定の値が入っている行を全て削除する」パターンです。例えば「A列が"完了"の行を削除する」「B列が空欄の行を削除する」「複数条件("A"かつ"B")に一致する行を削除する」などです。

📚 用語解説

InStr関数(VBA):VBAで文字列が含まれているかを調べる関数。「InStr(対象文字列, 検索文字列)」で検索文字列が見つかった位置(1始まり)を返します。見つからなければ0を返します。「If InStr(Cells(i, 1).Value, "削除") > 0 Then」で「A列に"削除"という文字を含む行」を検出できます。完全一致ではなく部分一致で検索できる点が特徴です。

'--- パターン1: A列が"完了"に完全一致する行を削除 --- Sub DeleteByExactMatch() Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lastRow To 2 Step -1 '2行目から(1行目はヘッダー) If Cells(i, 1).Value = "完了" Then Rows(i).Delete End If Next i End Sub '--- パターン2: A列に"削除"を含む行を削除(部分一致・InStr使用)--- Sub DeleteByPartialMatch() Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lastRow To 2 Step -1 If InStr(Cells(i, 1).Value, "削除") > 0 Then Rows(i).Delete End If Next i End Sub '--- パターン3: 複数条件(A列が"完了" または B列が"不要")の行を削除 --- Sub DeleteByMultiCondition() Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lastRow To 2 Step -1 If Cells(i, 1).Value = "完了" Or Cells(i, 2).Value = "不要" Then Rows(i).Delete End If Next i End Sub

06 重複行の削除(RemoveDuplicates) 1列基準・複数列組み合わせ基準の重複削除を解説

Excelのデータに重複した行が混在している場合、VBAのRemoveDuplicatesメソッドを使うと一括で重複行を削除できます。手動で「データ」タブ→「重複の削除」を操作するよりも、マクロで自動化することで毎回の操作を省略できます。

📚 用語解説

RemoveDuplicates(リムーブデュプリケーツ):Excelの指定範囲内の重複行を削除するVBAメソッド。「Range("A1:C100").RemoveDuplicates Columns:=Array(1), Header:=xlYes」の形式で使います。「Columns:=Array(1)」で重複判定する列を指定(1=A列)、複数列の組み合わせで判定する場合はArray(1,2)のように指定します。「Header:=xlYes」で1行目をヘッダーとして扱い、削除対象から除外します。

'--- パターン1: A列の値が重複している行を削除 --- Sub RemoveDuplicateRows_Single() Dim lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row Range("A1:E" & lastRow).RemoveDuplicates _ Columns:=Array(1), _ 'A列の値が重複している行を削除 Header:=xlYes '1行目はヘッダー(削除対象外) End Sub '--- パターン2: A列とB列の組み合わせが重複している行を削除 --- Sub RemoveDuplicateRows_Multi() Dim lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row Range("A1:E" & lastRow).RemoveDuplicates _ Columns:=Array(1, 2), _ 'A列+B列の組み合わせが重複している行を削除 Header:=xlYes End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 空白行・空白列を一括削除する実践コード IsEmpty・SpecialCells(xlCellTypeBlanks)を使った空白行削除パターン

データ整理でよく必要になるのが「A列が空欄の行を全て削除する」操作です。CSVをExcelに取り込んだ際や、データが飛び飛びで入力されているケースで発生します。

📚 用語解説

IsEmpty関数(VBA):VBAでセルが空欄(値も数式もない状態)かどうかを判定する関数。「If IsEmpty(Cells(i, 1)) Then」でA列のi行目が空欄かを確認できます。スペースが入力されたセルはIsEmptyでFalseになるため、スペースを含む場合はTrim関数を組み合わせて「If Trim(Cells(i, 1).Value) = "" Then」の形式を使います。

'--- パターン1: A列が空欄の行を全て削除 --- Sub DeleteBlankRows() Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lastRow To 2 Step -1 '逆順ループ必須 If Trim(Cells(i, 1).Value) = "" Then 'Trimでスペースも空欄扱い Rows(i).Delete End If Next i End Sub '--- パターン2: SpecialCells(xlCellTypeBlanks)で空白セル行を高速削除 --- Sub DeleteBlankRows_Fast() On Error Resume Next '空白セルがない場合のエラー回避 Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 End Sub

7-2. 処理速度を上げる最適化テクニック(ScreenUpdating)

大量の行を削除する際に処理が遅い場合、Application.ScreenUpdating = Falseで画面更新を止めることで大幅に高速化できます。

Sub DeleteRowsOptimized() '--- 処理前に画面更新を停止(大幅に高速化) --- Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '自動計算も停止 Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lastRow To 2 Step -1 If Cells(i, 1).Value = "完了" Then Rows(i).Delete End If Next i '--- 処理後に必ず元に戻す --- Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

08 Claude CodeでVBA削除処理を自動生成する 「条件を日本語で伝えるだけ」でVBAコードが完成する手順

VBAの削除コードは「どの列を基準にするか」「完全一致か部分一致か」「逆順ループが必要かどうか」など、ケースによって微妙に異なります。Claude Codeに削除条件を日本語で伝えるだけで、最適なVBAコードを自動生成できます。

✔️「A列に"完了"または"キャンセル"が含まれている行を全て削除するVBAを書いて」
✔️「B列が空欄の行を全て削除するVBAを書いて。ヘッダー行は削除しないで」
✔️「C列とD列の値の組み合わせが重複している行を削除するVBAを書いて」
✔️「上から5行目から20行目の範囲で、E列の値が0以下の行だけ削除するVBAを書いて」
✔️「この条件付き削除VBAを高速化したい。ScreenUpdatingとCalculationの最適化を加えて」
削除条件を日本語で伝える
「A列が空欄の行を削除して」
Claude CodeがVBAを生成
逆順ループ・最適化込み
VBEに貼り付けて実行
Alt+F11でエディタを開く
数秒で自動削除完了
手作業から解放
VBA操作手作業の時間VBAマクロの時間削減効果
"完了"行の削除(100行)5分3秒99%削減
空白行の一括削除(500行)20分5秒99%削減
重複行の削除(1000行)30分2秒99%削減
複数条件の行削除(300行)15分3秒99%削減

VBA業務自動化・Excelマクロ開発をClaude Code×AI鬼管理で高速化

行削除・データクリーニング・重複行処理など、毎回手作業で行っているExcel業務を、Claude Codeを使ったVBAマクロで自動化する方法をご紹介します。

代表菅澤 代表菅澤
VBAの削除コードは、条件の組み合わせが多く自分で書くと時間がかかります。Claude Codeに「こういう条件で行を削除したい」と日本語で伝えるだけで、逆順ループや最適化込みのコードが完成します。無料相談でご要件をお聞きします。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. VBAで行を削除するときになぜ逆順ループ(Step -1)が必要なのですか?

A. 行を削除すると下の行が1つ上に詰まるため、順番(1,2,3...)にループすると行番号がずれてしまいます。例えば3行目を削除すると元の4行目が3行目になります。次にi=4を処理しようとすると、元の5行目(新しい4行目)を処理してしまい、元の4行目(新しい3行目)をスキップしてしまいます。逆順ループ(最終行から先頭へStep -1)で処理すれば、下の行を削除しても上の行のインデックスは変わらないため正しく動作します。

Q. VBAのClearとDeleteは何が違いますか?

A. DeleteはExcelの行・列・セルそのものを取り除き、隣の行・列・セルが詰まります(行が削除されると下の行が上に移動)。ClearはExcelの行・列・セルの中身(値・書式・数式等)を消去しますが、行・列・セルの位置は変わりません。テンプレートの入力欄をリセットしたい場合はClear(またはClearContents)を使い、不要な行を取り除きたい場合はDeleteを使います。

Q. VBAでA列が空欄の行を全て削除する最も簡単なコードは?

A. 「On Error Resume Next: Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete: On Error GoTo 0」の1行で空白行を一括削除できます。ただし、A列が空欄でも他の列にデータがある行も削除されるので注意が必要です。特定の条件で空白行を削除したい場合は、For文とIsEmpty・Trim関数を組み合わせたコードを使います。

Q. VBAのRemoveDuplicatesで全列が重複しているときだけ削除するにはどうすればいいですか?

A. 「Range("A1:E" & lastRow).RemoveDuplicates Columns:=Array(1,2,3,4,5), Header:=xlYes」のようにColumnsに全列番号を指定します。5列あれば1から5を全てArrayに含めます。これで全列の値の組み合わせが完全に一致している場合のみ重複と見なして削除します。

Q. VBAで特定のシートの全データをクリアするにはどうすればいいですか?

A. Sheets("シート名").Cells.Clear で指定したシートの全セルをクリアできます。値・書式・数式・コメントが全て消えます。値だけを消してテンプレートの書式を残したい場合は「Sheets("シート名").Cells.ClearContents」を使います。また「Sheets("シート名").UsedRange.ClearContents」でデータが存在する範囲だけをクリアすることもできます。

Q. VBAでフィルター結果の可視行だけを削除するにはどうすればいいですか?

A. 「ActiveSheet.AutoFilter.Range.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete」でオートフィルターで絞り込まれた可視セルの行だけを削除できます。Offset(1, 0)でヘッダー行(1行目)を除外しています。フィルターが設定されていない場合はAutoFilterを先に設定するか、On Error Resume Nextでエラーを無視してください。

なお、大量の行に対してDeleteを繰り返す場合、画面が点滅して遅く感じることがあります。これはExcelが行削除のたびに画面を再描画しているためです。Application.ScreenUpdating = Falseを設定すると再描画を止め、全件削除後にTrueに戻すことで処理が大幅に高速化します。100行の条件付き削除で体感10倍以上速くなるケースもあります。またApplication.Calculation = xlCalculationManualで自動計算を止めておくとさらに効果的です。必ず処理後に両方を元の値に戻してください。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月18日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。