Excel VBA 逆引き集 | 列を削除

Excel VBA
スポンサーリンク

列を削除

「指定列を消す」「複数列まとめて」「離れた列だけ」「最終列まで」「テーブル列を安全に削除」まで、初心者が迷わない最短コードと注意点を整理します。基本は Columns(…).Delete、Range(…).EntireColumn.Delete を使います。


基本:単一列・複数列の削除

Sub DeleteColumn_Basic()
    'B列を削除(右の列が左へ詰まる)
    Columns("B").Delete

    '列番号で指定(2列目=B列)
    Columns(2).Delete

    'C〜E列をまとめて削除
    Columns("C:E").Delete
End Sub
VB
  • ポイント:
    • 単一列: Columns(“B”) または Columns(2)。結果は同じです。
    • 複数列: “C:E” のように範囲指定で一度に削除できます。

離れた列だけを削除(複数範囲)

Sub DeleteColumn_Discontinuous()
    'C列とE〜F列をまとめて削除(離れた範囲をカンマで列挙)
    Range("C:C,E:F").Delete
End Sub
VB
  • ポイント:
    • 複数範囲: Range(“C:C,E:F”) のように、離れた列も一度に削除可能です。

セルから「その列」を削除

Sub DeleteColumn_FromCell()
    'B3セルが属する列を削除
    Range("B3").EntireColumn.Delete
End Sub
VB
  • ポイント:
    • EntireColumn: 対象セルの列を確実に削除できます。

動的に「最終列まで」を削除(表の右端が毎回変わるとき)

Sub DeleteColumn_ToLast()
    Dim lastCol As Long
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column '1行目の最終列
    'B列〜最終列まで削除(見出し構成の整理などに)
    Range(Columns(2), Columns(lastCol)).Delete
End Sub
VB
  • ポイント:
    • 最終列取得: End(xlToLeft) は見えている最右の使用列を返します。
    • Range + Columns: 数値指定の複数列削除は Range(Columns(2), Columns(3)) の形で書きます。

条件で列を削除(見出し名で探して消す)

Sub DeleteColumn_ByHeader()
    Dim f As Range
    Set f = Rows(1).Find(What:="削除対象", LookIn:=xlValues, LookAt:=xlWhole)
    If Not f Is Nothing Then f.EntireColumn.Delete
End Sub
VB
  • ポイント:
    • Find: 見出し名で列を特定し、安全に削除できる定番パターンです。

テーブル(ListObject)の列を安全に削除

Sub DeleteColumn_FromListObject()
    Dim lo As ListObject
    Set lo = ActiveSheet.ListObjects("売上テーブル")
    '列名を基準に削除(構造化表を壊さない)
    lo.ListColumns("備考").Delete
End Sub
VB
  • ポイント:
    • ListColumns.Delete: テーブルは Columns.Delete より専用APIを使うのが安全です。

例題で練習

例題1:不要な項目列(C〜E)を一括削除

Sub Example_DeleteColumnsRange()
    Columns("C:E").Delete
End Sub
VB

例題2:見出し「メモ」「備考」列があれば削除

Sub Example_DeleteByHeaders()
    Dim h As Variant, f As Range, i As Long
    h = Array("メモ", "備考")
    For i = LBound(h) To UBound(h)
        Set f = Rows(1).Find(What:=h(i), LookIn:=xlValues, LookAt:=xlWhole)
        If Not f Is Nothing Then f.EntireColumn.Delete
    Next
End Sub
VB

例題3:B列から最終列まで初期化のため削除

Sub Example_DeleteToLast()
    Dim lastCol As Long
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
    If lastCol >= 2 Then Range(Columns(2), Columns(lastCol)).Delete
End Sub
VB

実務の落とし穴と対策

  • 参照ずれ: 列削除は構造が変わる操作。数式の参照がずれる可能性があるため、削除前に対象列と依存列を確認します。
  • シート保護: 保護中は削除できません。必要なら解除してから実行します。
  • 結合セル: 結合があると削除動作が不安定。結合は最小限にするか解除してから削除します。
  • 大量削除で遅い: ScreenUpdating/Calculation を一時的にオフにして高速化し、終わったら戻すのが定石です。
Sub SpeedWrap_DeleteColumns()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '…列削除処理…
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB
タイトルとURLをコピーしました