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
VBRows(5) も Rows(5).EntireRow も、ここでは「5行目を行として削除する」という意味でほぼ同じです。
複数行をまとめて削除する
Sub SampleDeleteMultiRows()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
' 5~7行目をまとめて削除
ws.Rows("5:7").Delete
End Sub
VB5~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)」を必ず意識して使い分ける
