【Excel VBA】列を削除する方法!複数列や別シート列も対応可!

【Excel VBA】列を削除する方法!複数列や別シート列も対応可!
Excel VBAで列を削除する方法を知りたいときはないでしょうか。

けど、そんな中で悩むことは、

・Columns(“C:C”).Delete と書いたのに、思った列が消えない
・複数列をまとめて削除する書き方が分からない
・「列ごと消す」と「中身だけ消す」の違いが分からない

ですよね。

今回はそんなお悩みを解決する、

・VBAで列を削除する基本の書き方
・複数列をまとめて削除する方法(ループの落とし穴)
・Delete と ClearContents の使い分け
・別シートの列を削除する方法
・削除したときに数式がどうなるか

についてまとめます!

完成イメージ

列の削除は、Columns(“列:列”).Delete の1行でできます。
今回は
・「商品/数量/区分/単価/金額/担当/備考」の表から、VBAで「区分」「担当」「備考」の列を削除する方法
をゴールにします。
削除すると右側の列が左へ詰まりますが、金額の数式は自動で追従します。

なお、複数列をまとめて削除する方法・ループで消すときの落とし穴・
Delete と ClearContents の違い・別シートの列を削除する方法もあわせてご紹介します。
早速実装して試してみましょう!
完成イメージ
上の画像が完成形です。「区分」「担当」「備考」の列が削除され、金額の数式も正しく残っています。

STEP1. 元データを用意する

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

下の表をコピーして、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つずつ左へ詰まります。

POINT
・列を削除すると右側の列が左へ詰まるので、数式の参照は自動で調整されます
・Columns(“C:C”) はアクティブシートに効きます
・削除した列を参照していた数式は #REF! エラーになります(後半で解説)
C列(区分)を削除した状態

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行が一番安全で、列番号のずれも気にしなくていいのでカンタンですね。
2列まとめて削除した状態

STEP4. Delete と ClearContents の違い

「列ごと消したい」のか「中身だけ消したい」のかで、使う命令が変わります。

Sub 削除とクリアの違い()
    ' 列ごと削除する(右の列が左へ詰まる)
    Columns("C:C").Delete

    ' 中身と書式だけ消す(列は残る・右の列は動かない)
    Columns("C:C").ClearContents
End Sub
命令 列そのもの 書式 右の列
Delete 消える 消える 左へ詰まる
ClearContents 残る 残る 動かない
ClearFormats 残る 消える 動かない
Clear(すべて消去) 残る 消える 動かない

「列の位置は動かしたくないけれど、中身だけ消したい」ときは ClearContents を使います。
どちらを使うかで表のレイアウトが変わってしまうので、ここはしっかり使い分けましょう。
Delete と 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(“集計”) のように
ブックから指定すると確実です。

POINT
・間違えて消してしまわないよう、削除の前には必ずシートを指定する
・ThisWorkbook を付けると「マクロのあるブック」に限定できます
・ブックを指定しない Worksheets はいま開いているブックが対象です
別シートの列を削除した状態

STEP6. 列を削除すると数式はどうなる?

削除した列を参照していた数式は、#REF! エラーになります。
上の画像の右側がその例です。
「確認用」の列(E列)を参照していた数式が、列を削除したとたん #REF! になりました。

数式の状態 削除後の動き
削除した列より左の列を参照 そのまま(変化なし)
削除した列より右の列を参照 自動で調整される(ずれない)
削除した列そのものを参照 #REF! エラーになる
削除した列を絶対参照($E$1)で参照 同じく #REF! になる

#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で列を削除する方法をまとめました。

1. 1列の削除は Columns(“C:C”).Delete
2. 複数列は Columns(“C:D”).Delete のように範囲で指定
3. ループで消すときは Step -1 で後ろから(前からだと列がずれる)
4. 中身だけ消すなら ClearContents(列は残る)
5. 別シートは Worksheets(“シート名”).Columns(…) とシートを指定

列の削除は、「列ごと消す」か「中身だけ消す」かを決めるのが最初の一歩ですね。

不要な列を消して表をスッキリさせたいときは、この手順をぜひ試してみてください。

最後までお読みいただきありがとうございました。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。






コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA ImageChange Image