和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セル・セル範囲・行・列を削除する - Delete

セルや行・列を削除する、Deleteメソッドについて解説します。

基本構文

削除したいセル範囲.Delete Shift(削除後のスライド方向)

 
◇ Shift(削除後のスライド方向)に使用できる引数

定数名 内容
xlShiftUp 残りのセルを上方向へ移動
xlShiftToLeft 残りのセルを左方向へ移動

※ 省略時は手作業実行時と同じく「Excelが自動で判定」した方向に実行されます。
※ xlUp、xlToLeft と値が同じであるため、この定数を使っても同様に動きます。

サンプルコード

' 3行目を削除する
Rows(3).Delete

' 3行目から5行目まで削除する
Rows("3:5").Delete

' B列を削除する
Columns("B").Delete

' B列からD列まで削除する
Columns("B:D").Delete

' セルC3を削除(上方向にシフト)
Range("C3").Delete Shift:=xlShiftUp

' セルC3を削除(左方向にシフト)
Range("C3").Delete Shift:=xlShiftToLeft

' セル範囲C1:D5を削除(上方向にシフト)
Range("C1:D5").Delete Shift:=xlShiftUp

' セル範囲C1:D5を削除(左方向にシフト)
Range("C1:D5").Delete Shift:=xlShiftToLeft

' セルC3を基準に「行全体を削除」
Range("C3").EntireRow.Delete

' セルC3を基準に「列全体を削除」
Range("C3").EntireColumn.Delete

 

解説

Rangeオブジェクト.Deleteメソッドを実行すると、
指定したセルや行・列を削除することができます。


手作業で実行したときと同様、既存のセルは削除分スライドし、
右・下どちらからスライドさせるかを第1引数で指定することができます。

この引数は以下のダイアログと連動していますが、
前述の通り定数には「左方向」「上方向」だけしか選択肢がありません。

削除ダイアログ


たとえば行全体や列全体の削除をマクロ記録してみると、

Selection.EntireRow.Delete
Selection.EntireColumn.Delete

が記録される通り、この行列全体の削除はDeleteの機能ではなく、
Entireプロパティを使用する機能がこのダイアログに備わっているだけのようです。


手作業と同様、罫線や書式なども含めてセルごと削除されるため、
「値だけを消す」場合はClearやClearContentsメソッドを使用してください。

第1引数Shiftの省略について

第1引数Shift(削除後のスライド方向)を省略した場合、
挙動は以下のようになります。

  • 行全体から実行した場合:常に「上方向にシフト」
  • 列全体から実行した場合:常に「左方向にシフト」
  • 単独セルから実行した場合:(おそらく)「上方向にシフト」
  • セル範囲から実行した場合:「Excelが推定した方向」


セル範囲から実行した場合の「Excelが推定した方向」は、

セル範囲の形状 スライド方向
横長(列数 > 行数) 上方向
縦長(行数 > 列数) 左方向
正方形(行数=列数) 上方向

こんな判定がされているようです。


いくつか試してみた感じ、

  • 2×3 のセル範囲なら上方向にシフト
  • 3×2 のセル範囲なら左方向にシフト
  • 2×2 のセル範囲なら上方向にシフト

という挙動になっていました。


と言いつつこれを利用してコードを書くのは危険ですから、
セル範囲からDeleteを実行する場合は必ず第1引数は指定しましょう。


なお、行列全体を削除する場合は第1引数は無視される仕様のようで、

Rows(3).delete Shift:=xlShiftToLeft

このように「行を削除して左方向にシフト」という実行不可能なコードを書いても、
行を削除して上方向にシフトするコードとして実行されました。

なので書いても書かなくても、間違った書き方をしても、
いずれにせよ同じ挙動で実行されるようです。


人間的にも省略してもどう動くか一目瞭然ですから、
行列全体の削除時は、第1引数は省略してOKです。