和風スパゲティのレシピ

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

セル・セル範囲・行・列を挿入する - Insert

セルや行・列を挿入する、Insertメソッドについて解説します。

基本構文

挿入したいセル範囲.Insert Shift(挿入後のスライド方向), CopyOrigin(書式コピー元)


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

定数名 内容
xlShiftDown 元のセルを下方向へ移動
xlShiftToRight 元のセルを右方向へ移動

※ 省略時は手作業実行時と同じく「Excelが自動で判定」した方向に実行されます。


◇ CopyOrigin(書式コピー元)に使用できる引数

定数名 内容
xlFormatFromLeftOrAbove 左または上の書式をコピー(規定値)
xlFormatFromRightOrBelow 右または下の書式をコピー

サンプルコード

' 3行目に1行挿入する
Rows(3).Insert

' 3行目から5行目まで3行挿入する
Rows("3:5").Insert

' 3行目に1行挿入する際、4行目のセル書式を用いる
Rows(3).Insert CopyOrigin:=xlFormatFromRightOrBelow

' B列に1列挿入する
Columns("B").Insert

' B列からD列まで3列挿入する
Columns("B:D").Insert

' B列に1列挿入する際、C列のセル書式を用いる
Columns("B").Insert CopyOrigin:=xlFormatFromRightOrBelow

' セルC3に1セル挿入(下方向にシフト)
Range("C3").Insert Shift:=xlShiftDown

' セルC3に1セル挿入(右方向にシフト)
Range("C3").Insert Shift:=xlShiftToRight

' セル範囲C1:D5を挿入(下方向にシフト)
Range("C1:D5").Insert Shift:=xlShiftDown

' セル範囲C1:D5を挿入(右方向にシフト)
Range("C1:D5").Insert Shift:=xlShiftToRight

' セルC3を基準に「行全体を挿入」
Range("C3").EntireRow.Insert

' セルC3を基準に「列全体を挿入」
Range("C3").EntireColumn.Insert

解説

Rangeオブジェクト.Insertメソッドを実行すると、
指定した位置にセルや行・列を挿入することができます。


手作業で実行したときと同様、既存のセルは挿入セル範囲分移動することになり、
そのスライド方向を第1引数で指定することができます。

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

挿入ダイアログ

行全体・列全体をマクロ記録してみると、

Selection.EntireRow.Insert
Selection.EntireColumn.Insert

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


その他、セルの表示形式や罫線等の書式について、
どちらの方向からコピーしてくるかを設定できます。

こちらは省略時は「左または上」からコピーしてきますので、
「右または上」からコピーしたい場合は引数を明示してください。

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

第1引数Shift(挿入時のスライド方向)を省略した場合は、

  • 行全体から実行した場合は必ず「下方向にシフト」
  • 列全体から実行した場合は必ず「右方向にシフト」
  • 単独セルから実行した場合は(おそらく)「下方向にシフト」
  • セル範囲から実行した場合は「Excelが推定した方向」

が選択される仕様になっています。


「Excelが推定した方向」とは、
「セル範囲が横長なら下方向、縦長なら右方向」
「正方形(行列数が同じ)なら下方向」

という条件で動いているようです。


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

  • 2×3のセル範囲なら下方向にスライド
  • 3×2のセル範囲なら右方向にスライド
  • 2×2のセル範囲なら下方向にスライド

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


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


なお、行列全体から実行した場合は第1引数は無視される仕様のようで、

Rows(3).Insert Shift:=xlShiftToRight

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

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


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