Excel VBAで列を削除する方法を知りたいときはないでしょうか。
けど、そんな中で悩むことは、
・複数列をまとめて削除する書き方が分からない
・「列ごと消す」と「中身だけ消す」の違いが分からない
ですよね。
今回はそんなお悩みを解決する、
・複数列をまとめて削除する方法(ループの落とし穴)
・Delete と ClearContents の使い分け
・別シートの列を削除する方法
・削除したときに数式がどうなるか
についてまとめます!
完成イメージ
列の削除は、Columns(“列:列”).Delete の1行でできます。
今回は
・「商品/数量/区分/単価/金額/担当/備考」の表から、VBAで「区分」「担当」「備考」の列を削除する方法
をゴールにします。
削除すると右側の列が左へ詰まりますが、金額の数式は自動で追従します。
なお、複数列をまとめて削除する方法・ループで消すときの落とし穴・
Delete と ClearContents の違い・別シートの列を削除する方法もあわせてご紹介します。
早速実装して試してみましょう!

上の画像が完成形です。「区分」「担当」「備考」の列が削除され、金額の数式も正しく残っています。
もくじ
STEP1. 元データを用意する
今回は、「区分」「担当」「備考」の列をVBAで削除していきます。
1行目が見出し、2行目以降がデータです。
金額列(E列)は =B2*D2 の数式にしておきましょう。
数式にしておくと、列を削除したときに参照が自動で調整されるのが確認できます。

下の表をコピーして、Excelのシートに貼り付けるとそのまま試せます。
| 商品 | 数量 | 区分 | 単価 | 金額 | 担当 | 備考 |
|---|---|---|---|---|---|---|
| ノートPC | 8 | 完了 | 148000 | None | 佐藤 | 納品済 |
| マウス | 25 | 完了 | 3980 | None | 鈴木 | |
| モニター | 12 | 保留 | 32800 | None | 高橋 | 入荷待ち |
| キーボード | 20 | 完了 | 6800 | None | 田中 | |
| プリンタ | 5 | 完了 | 45800 | None | 伊藤 | 納品済 |
| USBハブ | 30 | 完了 | 2480 | None | 渡辺 | |
| Webカメラ | 10 | 保留 | 8900 | None | 佐藤 | 入荷待ち |
| スピーカー | 15 | 完了 | 5600 | None | 鈴木 | |
| 外付けSSD | 18 | 完了 | 12800 | None | 高橋 | 納品済 |
| ヘッドセット | 22 | 完了 | 4200 | None | 田中 |
※ 数式で求める列は空にしています。すでに値が入っている列はそのまま残して試せます。
STEP2. 列を1つ削除する(基本)
いちばん基本の書き方です。
Sub 列を削除する()
' C列(区分)を削除する
Columns("C:C").Delete
End Sub
Columns(“C:C”) は「C列全体」という意味です。
そのまま .Delete を付けると、C列が削除されます。
削除されたぶん、右側の列は1つずつ左へ詰まります。
・Columns(“C:C”) はアクティブシートに効きます
・削除した列を参照していた数式は #REF! エラーになります(後半で解説)
STEP3. 複数列をまとめて削除する
「担当」と「備考」のように2列まとめて削除したいときは、範囲で指定します。
Sub 複数列を削除する()
' E・F列の2列をまとめて削除する
Columns("E:F").Delete
End Sub
Columns(“E:F”) のように「開始列:終了列」で書くと、その範囲の列がまとめて削除されます。
1列ずつ Delete を2回書くよりも、1行で済みます。
ここが落とし穴!ループで削除すると列がずれる
「C列から3列削除したい」ときに、うっかりループで書くと思った列が消えません。
Sub 失敗する書き方()
Dim i As Long
For i = 3 To 5
Columns(i).Delete ' × 1回目で列番号がずれる
Next i
End Sub
C列を削除すると、元のD列がC列に繰り上がります。
そのあと「4列目」を削除すると、元のE列(いまのD列)ではなく、さらに右の列が消えてしまいます。
正しくは、後ろから逆順に削除します。
Sub 正しい書き方()
Dim i As Long
For i = 5 To 3 Step -1 ' ○ 後ろから前に向かって削除する
Columns(i).Delete
Next i
End Sub
まとめて消せるなら Columns(“C:E”).Delete の1行が一番安全で、列番号のずれも気にしなくていいのでカンタンですね。

STEP4. Delete と ClearContents の違い
「列ごと消したい」のか「中身だけ消したい」のかで、使う命令が変わります。
Sub 削除とクリアの違い()
' 列ごと削除する(右の列が左へ詰まる)
Columns("C:C").Delete
' 中身と書式だけ消す(列は残る・右の列は動かない)
Columns("C:C").ClearContents
End Sub
| 命令 | 列そのもの | 書式 | 右の列 |
|---|---|---|---|
| Delete | 消える | 消える | 左へ詰まる |
| ClearContents | 残る | 残る | 動かない |
| ClearFormats | 残る | 消える | 動かない |
| Clear(すべて消去) | 残る | 消える | 動かない |
「列の位置は動かしたくないけれど、中身だけ消したい」ときは ClearContents を使います。
どちらを使うかで表のレイアウトが変わってしまうので、ここはしっかり使い分けましょう。

STEP5. 別シートの列を削除する
ここがいちばんハマりやすいポイントです。
Columns(“B:B”).Delete は「いま操作しているシート」の列に効きます。
別のシートの列を削除したいときは、シートを指定してから実行します。
Sub 別シートの列を削除する()
' × これだと「いま開いているシート」の列が消えてしまう
Columns("B:B").Delete
' ○ シート名を指定して削除する
Worksheets("集計").Columns("B:B").Delete
End Sub
| 書き方 | 削除されるシート |
|---|---|
| Columns(“B:B”).Delete | アクティブシート(いま操作中のシート) |
| Worksheets(“集計”).Columns(“B:B”).Delete | 「集計」シート |
| Sheets(2).Columns(“B:B”).Delete | 2番目のシート |
| ThisWorkbook.Worksheets(“集計”)… | マクロのあるブックの「集計」シート |
複数のブックを開いているときは、Workbooks(“ファイル名.xlsx”).Worksheets(“集計”) のように
ブックから指定すると確実です。
・ThisWorkbook を付けると「マクロのあるブック」に限定できます
・ブックを指定しない Worksheets はいま開いているブックが対象です
STEP6. 列を削除すると数式はどうなる?
削除した列を参照していた数式は、#REF! エラーになります。
上の画像の右側がその例です。
「確認用」の列(E列)を参照していた数式が、列を削除したとたん #REF! になりました。
| 数式の状態 | 削除後の動き |
|---|---|
| 削除した列より左の列を参照 | そのまま(変化なし) |
| 削除した列より右の列を参照 | 自動で調整される(ずれない) |
| 削除した列そのものを参照 | #REF! エラーになる |
| 削除した列を絶対参照($E$1)で参照 | 同じく #REF! になる |
#REF! が出たら、そのセルは手で数式を入れ直す必要があります。
削除する前に、その列を参照している数式がないか確認しておくのが安全ですね。

完成
「商品/数量/単価/金額」の4列になりました。
削除しても金額の数式は正しく計算されたままで、左へ詰まったレイアウトになっています。
思ったとおりに削除できましたか?

うまくいかないときの対処法(トラブルシュート)
実際に試すと、思ったように動かないこともあるかもしれません。
よくあるつまずきと対処法をまとめました。
| 症状 | 原因 | 対処 |
|---|---|---|
| Delete しても何も起きない | 列の指定が文字列になっている | Columns(“C:C”) のように引用符で囲む/Columns(3) でも可 |
| 違うシートの列が消えた | Columns はアクティブシートに効く | Worksheets(“シート名”).Columns(…) とシートを指定する |
| ループで消したら別の列が消えた | 削除で列番号がずれる | 後ろから逆順(Step -1)に削除する/範囲でまとめて削除する |
| 1列しか削除されない | 範囲ではなく1列だけを指定している | Columns(“C:D”) のように範囲で指定する |
| 数式が #REF! になった | 削除した列を参照している | そのセルの数式を入れ直す/削除前に参照を確認する |
| 罫線やレイアウトが崩れた | Delete で右の列が左へ詰まった | 列を残したいなら ClearContents を使う |
| エラー 1004 が出る | シートが保護されている/シート名が違う | Unprotect で保護を解除する/シート名を確認する |
よくある間違い
| 間違い | 起きること | 正しい書き方 |
|---|---|---|
| Columns(C:C) と書く | 変数として扱われエラー | Columns(“C:C”) と引用符で囲む |
| Rows と Columns を間違える | 行が削除される | 列なら Columns、行なら Rows |
| ループで前から削除する | 列番号がずれて別の列が消える | Step -1 で後ろから削除する |
| Delete と ClearContents を混同する | 表のレイアウトが崩れる | 列ごと消すなら Delete、中身だけなら ClearContents |
| 削除前にバックアップを取らない | 戻せない(Save 後は特に) | 削除の前に SaveCopyAs で控えを取る |
| Select を使って削除する | 遅く、画面がちらつく | Select せずに直接 Delete する |
列の削除方法の使い分け
| やりたいこと | 書き方 |
|---|---|
| 1列削除する | Columns(“C:C”).Delete |
| 2列まとめて削除する | Columns(“C:D”).Delete |
| 中身だけ消す(列は残す) | Columns(“C:C”).ClearContents |
| 書式も消す(列は残す) | Columns(“C:C”).Clear |
| 別シートの列を削除する | Worksheets(“集計”).Columns(“B:B”).Delete |
| 本数を変数で決める | Columns(“C:C”).Resize(, n).Delete |
| 行を削除する | Rows(“5:6”).Delete |
エク短流:空の列だけをまとめて削除する
「作業用に追加した列が増えすぎた」というときは、
見出しが空の列を探して、まとめて削除すると一気に片付きます。
Sub 空の列をまとめて削除する()
Dim ws As Worksheet, lastCol As Long, i As Long
Set ws = Worksheets("売上データ")
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' 後ろから前に向かって調べる(削除で列番号がずれないように)
For i = lastCol To 1 Step -1
If Trim(ws.Cells(1, i).Value) = "" Then
ws.Columns(i).Delete
End If
Next i
MsgBox "見出しが空の列を削除しました"
End Sub
後ろから前に向かって調べるのがポイントです。
前から削除すると、削除のたびに列番号がずれて判定が1列飛んでしまいます。
ボタンに割り当てておけば、作業列の整理を1クリックで終えられます。
実行前に SaveCopyAs で控えを取る、シート名を必ず指定する、この2つを習慣にしておくと安心ですよ。
さいごに
今回は、Excel VBAで列を削除する方法をまとめました。
2. 複数列は Columns(“C:D”).Delete のように範囲で指定
3. ループで消すときは Step -1 で後ろから(前からだと列がずれる)
4. 中身だけ消すなら ClearContents(列は残る)
5. 別シートは Worksheets(“シート名”).Columns(…) とシートを指定
列の削除は、「列ごと消す」か「中身だけ消す」かを決めるのが最初の一歩ですね。
不要な列を消して表をスッキリさせたいときは、この手順をぜひ試してみてください。
最後までお読みいただきありがとうございました。












コメントを残す