Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Delete

Excel VBA VBA
スポンサーリンク

Delete は「セル・行・列を“詰めて”消す動き」

まずイメージから。
さっき学んだ Insert が「押し広げてスペースを作る」なら、
Delete は「その場所を消して、周りを詰める」動きです。

手作業だと、

行番号を右クリック →「削除」
列見出しを右クリック →「削除」
セルを右クリック →「削除」→「上にシフト/左にシフト」

これを VBA でやるときに登場するのが Range.Delete です。

ここで超大事なのは、

「Delete は“値だけ消す”のではなく、“セルそのものを消して詰める”」
ということです。
値だけ消したいときは ClearContents、セルごと詰めたいときは Delete、ここをしっかり分けて考えます。


行を削除する(EntireRow.Delete)

5行目を丸ごと削除する

Sub SampleDeleteRow()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Rows(5).Delete

End Sub
VB

これで、

元の5行目が消える
元の6行目が5行目に、7行目が6行目に…と、下の行が上に詰められる

という動きになります。

より明示的に書くなら、こうです。

ws.Rows(5).EntireRow.Delete
VB

Rows(5)Rows(5).EntireRow も、ここでは「5行目を行として削除する」という意味でほぼ同じです。

複数行をまとめて削除する

Sub SampleDeleteMultiRows()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    ' 5~7行目をまとめて削除
    ws.Rows("5:7").Delete

End Sub
VB

5~7行目が消え、8行目以降が上に3行分詰められます。


列を削除する(EntireColumn.Delete)

C列を丸ごと削除する

Sub SampleDeleteColumn()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Columns("C").Delete

End Sub
VB

これで、

C列が消える
元の D列が C列に、E列が D列に…と、右の列が左に詰められる

という動きになります。

複数列も同じです。

ws.Columns("C:E").Delete   ' C~E列をまとめて削除
VB

セル単位で Delete する(Shift で“詰める方向”を決める)

A5 のセルを削除して「上に詰める」

Sub SampleDeleteCellUp()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Range("A5").Delete Shift:=xlShiftUp

End Sub
VB

これは、手作業で「セルの削除 → 上にシフト」を選んだのと同じです。

A5 が消え、
A6 の値が A5 に、A7 が A6 に…と、同じ列の下のセルが上に詰められます。

A5 のセルを削除して「左に詰める」

Sub SampleDeleteCellLeft()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Range("A5").Delete Shift:=xlShiftToLeft

End Sub
VB

今度は行方向に詰めます。

A5 が消え、
B5 の値が A5 に、C5 が B5 に…と、同じ行の右側が左に詰められます。


Delete と ClearContents の違いを、ここでハッキリさせておく

ここがめちゃくちゃ重要ポイントです。

ClearContents は「中身だけ消す」、Delete は「セルごと詰める」

例を見てください。

ws.Rows(5).ClearContents
VB

これは「5行目のセルの中身だけを消す」動きです。
行そのものは残るので、6行目は6行目のままです。

一方、

ws.Rows(5).Delete
VB

は「5行目そのものを消して、下の行を上に詰める」動きです。
元の6行目が5行目に繰り上がります。

同じように、

ws.Range("A5").ClearContents   ' A5 の中身だけ消える(セルは残る)
ws.Range("A5").Delete Shift:=xlShiftUp   ' A5 が消え、A6 以降が上に詰められる
VB

「見た目は“消えた”ように見えても、行・列の構造が変わるかどうか」が決定的に違います。

データの位置(行番号・列番号)を基準に処理しているマクロでは、
Delete を使うと行番号が変わるので、後続処理に影響が出ます。
「本当に行を詰めたいのか? それとも中身だけ消したいのか?」を、毎回意識して選んでください。


Delete を使うときに意識してほしい重要ポイント

「何を基準に、どこを詰めるか」を日本語で説明できるか

Insert のときと同じで、Delete も「どこが動くのか」が分かりにくくなりがちです。
コードを書くとき、必ず自分にこう説明してみてください。

この行(列・セル)を消して
その下(右)のデータをどこまで詰めたいのか

例えば、

ws.Rows(5).Delete
VB

なら、

「5行目を消して、6行目以降を全部1行上に詰める」

と説明できます。

ws.Range("A5").Delete Shift:=xlShiftToLeft
VB

なら、

「A5 を消して、その行の A5 以降を左に1つずつ詰める」

と説明できます。

この「日本語で説明できるか」を毎回チェックすると、
Delete の“やりすぎ事故”をかなり防げます。

「どのシートの、どの行/列/セルか」を毎回はっきり書く

避けたい書き方の例です。

Rows(5).Delete
Columns("C").Delete
Range("A5").Delete Shift:=xlShiftUp
VB

これは「アクティブなシート」を前提にしているので、
シートが変わると、全く別の場所の行や列を消してしまう危険があります。

超初心者のうちから、あえてこう書く癖をつけてください。

ThisWorkbook.Worksheets("入力").Rows(5).Delete
ThisWorkbook.Worksheets("入力").Columns("C").Delete
ThisWorkbook.Worksheets("入力").Range("A5").Delete Shift:=xlShiftUp
VB

あるいは変数を使って:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")

ws.Rows(5).Delete
ws.Columns("C").Delete
ws.Range("A5").Delete Shift:=xlShiftUp
VB

「どのブック → どのシート → どの行/列/セル → どの方向に詰めるか」
という順番を崩さない書き方は、Delete では特に大事です。
間違えると“元に戻せない破壊”になりやすいので、ここは慎重にいきましょう。


まとめ:Delete は「セル構造そのものを変えて、データを詰めるためのメソッド」

Delete の本質は、

「指定した行・列・セルを“構造ごと”消して、周りのセルを上または左に詰める」

ことです。

押さえておきたいポイントをコンパクトにまとめると、

行削除 → Rows(n).Delete(下の行が上に詰まる)
列削除 → Columns("C").Delete(右の列が左に詰まる)
セル単位 → Range("A5").Delete Shift:=xlShiftUp / xlShiftToLeft
「中身だけ消す(ClearContents)」と「セルごと詰める(Delete)」を必ず意識して使い分ける

タイトルとURLをコピーしました