はじめに
セルの挿入は、Rangeオブジェクトの Insert メソッドを使います。
Insert メソッドを使うときには、引数のShift に値をセットして使います。
引数のShiftは省略可能でシステムが勝手に決めてくれますが把握しずらいので、Shiftで指定する必要があります。
Range().Insert Shift:=xlShiftToRight 右方向にシフト
Range().Insert Shift:=xlShiftDown 下方向にシフト
挿入されたセルは、形式がコピーされます。
セルの挿入
基本的な使い方は以下の通りです。
Sub macro1()
'引数Shiftには、xlShiftToRight または xlShiftDown のいずれかを指定します。
Range("B2").Insert Shift:=xlShiftToRight '右方向にシフト
Range("C3").Insert Shift:=xlShiftDown '下方向にシフト
End Sub
上記のように、Insertメソッドには、引数Shiftに、xlShiftToRight または xlShiftDown のいずれかを指定します。
xlShiftToRight では右にシフト。
xlShiftDown では下にシフトします。
以下のようなシートで上記のプログラムを実行すると、

以下のようにセルが挿入されます。

行・列の挿入
行単位、列単位の挿入でも Insert メソッドを使用しますが、Shift 引数の指定は不要です。
行の指定方法は、いくつか種類があります。
行の挿入
複数の行を挿入する場合、下から挿入していくのがコツです。
Sub macro2()
'行の挿入
Range("B3").EntireRow.Insert 'B3セルの行に挿入
Rows(2).Insert '2行目に挿入
Range("1:1").Insert '1行目に挿入
End Sub

上記のような状態で実行すると以下のようになります。

列の挿入
列の挿入も同じように書く事ができます。
Sub macro3()
'列の挿入
Range("E3").EntireColumn.Insert
Columns(4).Insert
Range("C:C").Insert
End Sub
実行すると以下のようになります。
列の場合は、1つおきに間隔を空けたい場合は、対象の最も右側から挿入するようにするのがコツです。

挿入されたセルの書式設定
これまで、セル単体や行、列が挿入された例を良く見てみると罫線が引き継がれているのがわかると思います。
(1行目や1列目では引き継がれません。)
例えば、以下のように、1行目に日付、2行目以降に数値(小数点以下第2位まで表示)の表があった場合を想定してみます。

日付や数値の小数点などの書式設定は引継がれます。
この表で2行目に挿入を行うと以下のようになり、もしA2セルに「2」を入力した場合、「1月2日」となってしまいます。背景色も同じなので、書式設定がコピーされているのがわかります。

ここでは、行の挿入後、3行目以降の書式を指定した方が便利です。
これを実現するのが、CopyOrigin 引数です。
CopyOrigin では、上下(左右)どちら側のセルの形式をコピーするかを指定できます。
Sub macro4()
'2行目に行を挿入し、下(3行目)の形式をコピーする。
Range("2:2").Insert CopyOrigin:=xlFormatFromRightOrBelow
End Sub
CopyOrigin は以下の2つの値を指定できます。
名前 | 値 | 説明 |
---|---|---|
xlFormatFromLeftOrAbove | 0 | 上(または左)のセルから形式をコピー。(既定値) |
xlFormatFromRightOrBelow | 1 | 下(または右)のセルから形式をコピー。 |
なにも指定しない場合は、xlFormatFromLeftOrAbove が採用されるので、CopyOrigin を指定する時は、xlFormatFromRightOrBelow とセットになるでしょう。
書式設定をコピーしたくない時
Insert メソッドでは形式のコピーが起こってしまいます。
挿入したセルや行、列の形式を別の形式(例えば標準)にしたい場合、これをクリアするようなオプションは無いので、後から設定を上書きする必要があります。
以下の例では、2行目に行を挿入して、セル形式を標準にしています。
(0 が 0.00 となっていない)

プログラムは以下のようになります。
Sub macro5()
Range("2:2").Insert CopyOrigin:=xlFormatFromRightOrBelow
Range("2:2").NumberFormatLocal = "G/標準"
End Sub
この時、With を使って2つをまとめると思った通りの結果にはならないので注意しましょう。
'Withを使って以下のように書くとうまく行きません!
With Range("2:2")
.Insert CopyOrigin:=xlFormatFromRightOrBelow
.NumberFormatLocal = "G/標準"
End With
この場合、NumberFormatLocal は挿入後の3行目が対象となってしまいます。
まとめ
セルの挿入はでは、以下の事に注意して使用するようにしましょう。
・単体のセルの挿入では、xlShiftToRight または xlShiftDown のいずれかを指定します。
・行全体、列全体の挿入は Insert のみでOK。
・挿入されたセルは、形式もコピーされます。(デフォルトでは、上または左のセルから形式コピー)
・With を使った記述では挿入されたセルが対象とならない。
コメント