シートに行を追加するには
シートに行を追加する場合、RangeオブジェクトのInsertメソッドを利用します。
なお、複数行追加する場合については「VBAでシートに空行を複数行追加する」もご参照ください。
VBAでは2通りの書き方があります。
「どのセルの行に追加するか?」という書き方である、セルを示すRangeオブジェクトを使った場合の「Range.EntireRow.Insert」の書き方と、「どの行全体に行を追加するか?」という書き方である、行を示すRangeオブジェクトを使った場合の「Range.Insert」の書き方です。
行を示すRowsオブジェクトを使う「Rows(n).Insert」の書き方も「Range.Insert」の書き方の一種になります。
このようにRangeオブジェクトが何(セル? 行全体?)を示しているのかで、「EntireRow.Insert」と「Insert」のどちらを使うのかが変わります。
以下の3つの関数はいずれも6行目に空行を追加します。ただ、書き方が異なります。
‘// どれも同じ
1 2 3 4 |
Sub addrowtest1() '// A6セルを起点に行全体(EntireRow)に行を追加する Range("A6").EntireRow.Insert End Sub |
1 2 3 4 |
Sub addrowtest2() '// 6行目を下にシフトして空行を追加する(Rangeで6行目を指定) Call Range("6:6").Insert(Shift:=xlDown) End Sub |
1 2 3 4 |
Sub addrowtest3() '// 6行目を下にシフトして空行を追加する(Rowsで6行目を指定) Call Rows(6).Insert End Sub |
どれを使ってもいいです。
Rangeオブジェクトがセルを表している場合は「Range.EntireRow.Insert」で書き、行全体を表している場合は「Range.Insert」で書きます。
それぞれについて詳細を以下で説明していきます。
1. Range.EntireRow.Insertでの行追加の書き方
A1のようにセル座標を示すRangeオブジェクトを利用する場合は、「Range.EntireRow.Insert」の書き方になります。考え方は「このセルがある行に空行を追加する」という意味になります。EntireRowが「セルの行全体」を意味し、それ(セルがある行の行全体)に対してInsertメソッドで行を追加します。
1 2 3 4 |
Sub addrowtest1() '// A6セルを起点に行全体(EntireRow)に行を追加する Range("A6").EntireRow.Insert End Sub |
ここでは「Range(“A6”)」と書いていますが、以下のように「Cells(6, 1)」を使っても同じセルを意味するため、Range(“A6”)で書いたときと同じ動作になります。
1 2 3 4 |
Sub addrowtest11() '// A6セルを起点に行全体(EntireRow)に行を追加する Cells(6, 1).EntireRow.Insert End Sub |
2. Range.Insertでの行追加の書き方
行全体を示すRangeオブジェクトを利用する場合は、「Range.Insert」の書き方になります。RangeオブジェクトがEntireRowオブジェクトを使わなくても既に行全体を表しているためです。
具体的には「Range(“6:6”)」のように書いて6行目全体を表している場合か、行全体を表すRowsオブジェクトを使って「Rows(6)」のように書いている場合になります。ここではRangeでの書き方を説明します。
1 2 3 4 |
Sub addrowtest2() '// 6行目を下にシフトして空行を追加する(Rangeで6行目を指定) Call Range("6:6").Insert(Shift:=xlDown) End Sub |
Insertの引数にShiftがあります。これは元のデータをセルの下か右のどちらに移動するかを指定します。省略した場合はRangeオブジェクトのセル範囲に応じて元データの移動方向が決まります。そのため、Rangeオブジェクトで行全体を表していることが分かっている場合は省略しても下方向に移動すると自動でやってくれますので以下のようにInsertの引数の「(Shift:=xlDown)」を省略しても構いません。
1 2 3 4 |
Sub addrowtest2() '// 6行目を下にシフトして空行を追加する(Rangeで6行目を指定) Call Range("6:6").Insert End Sub |
なお、複数行に空行を追加したい場合は、以下のようにRangeの引数の数字を変えればOKです。
1 2 3 4 |
Sub addrowtest2() '// 6行目から8行目を下にシフトして空行を追加する Call Range("6:8").Insert(Shift:=xlDown) End Sub |
3. Rows.Insertでの行追加の書き方
行全体を表すRowsオブジェクトを使った場合は、Rowsオブジェクトが行全体を表しているためEntireRowオブジェクトを使わなくても構いません。でも使っても行全体を再選択されるだけなのでエラーにはなりません。通常は省略されます。
以下のコードはEntireRowがあるかないかの違いですが、どちらもエラーにならずに同じように6行目に空行を追加します。
1 2 3 4 |
Sub addrowtest3() '// 6行目を下にシフトして空行を追加する(Rowsで6行目を指定) Call Rows(6).Insert End Sub |
1 2 3 4 |
Sub addrowtest31() '// 6行目を下にシフトして空行を追加する(Rowsで6行目を指定) Call Rows("6:6").EntireRow.Insert End Sub |
なお、複数行に空行を追加したい場合は、以下のようにRowsの引数の数字を変えればOKです。
1 2 3 4 |
Sub addrowtest32() '// 6行目から8行目を下にシフトして空行を追加する Call Rows("6:8").Insert End Sub |
空行を追加すると元のデータはどこに行くのか
空行を追加することで、元々そこにあったデータは下の行に押し下げられます。
では、シートの最下段にデータがある場合に空行を追加するとどうなるかと言うと、エラーになります。
それ以上、下に移動できません、という意味です。
行を追加した場合、印刷範囲が変わりますので、もし厳密な印刷設定をしている場合は行追加後に想定通りに印刷が出来るかチェックした方がよいでしょう。