印刷したときに見やすくするためや、後から手作業で追記するスペースを確保するために、データが入力されている各行の間に、空白行を1行ずつ挿入したい場合があります。
手作業で何十行も挿入するのは大変な手間ですが、VBAを使えばこの作業を一瞬で完了させることができます。この記事では、指定した範囲に1行おきに空白行を挿入するための、2つの代表的なVBAコードの書き方を解説します。
方法1:後ろからループ処理する方法(推奨)
行の挿入や削除を行うマクロでは、**最終行から先頭行に向かってループする(後ろからループする)**のが、最も安全で確実な方法です。
完成したVBAコード
Sub InsertRowsEveryOther_BackwardLoop()
' 変数を宣言します
Dim startRow As Long
Dim endRow As Long
Dim i As Long
'--- 設定 ---
startRow = 2 ' 処理を開始する行
' A列のデータ最終行を取得
endRow = Cells(Rows.Count, "A").End(xlUp).Row
'--- 設定ここまで ---
' 画面更新をオフにして高速化
Application.ScreenUpdating = False
'--- Forループで最終行から開始行へ向かって逆順に処理 ---
For i = endRow To startRow Step -1
' i行目の1つ下に行を挿入
Rows(i + 1).Insert
Next i
' 画面更新をオンに戻す
Application.ScreenUpdating = True
MsgBox "空白行の挿入が完了しました。"
End Sub
コードのポイント解説
For i = endRow To startRow Step -1
このコードの核心部分です。
endRow To startRow
: ループを最終行から開始行に向かって実行します。Step -1
: ループ1回ごとにカウンターi
を1ずつ減らすことを意味します。
なぜ後ろからループするのが良いのでしょうか?もし前からループして10行目に行を挿入すると、今まで11行目だったデータが12行目にずれてしまいます。しかし、後ろからループして10行目に行を挿入しても、それより前の9行目や8行目の位置には何の影響もありません。
このように、後ろからループすることで、行番号のズレを気にすることなく、シンプルで確実なコードを書くことができます。
方法2:前からループ処理する方法(参考)
次に、前から順番に処理していく方法です。アクティブセルを基準に動作するため、コードの動きが直感的で分かりやすいという利点があります。
完成したVBAコード
Sub InsertRowsEveryOther_ForwardLoop()
' 変数を宣言します
Dim rowsToInsert As Long
Dim i As Long
' 挿入したい空白行の数をユーザーに入力してもらう
rowsToInsert = Application.InputBox(Prompt:="何行分の空白行を挿入しますか?", Title:="行の挿入", Type:=1)
' 入力が0やキャンセルなら処理を終了
If rowsToInsert <= 0 Then Exit Sub
' 画面更新をオフにして高速化
Application.ScreenUpdating = False
' 処理を開始するセルを選択
Range("A2").Select
' Forループで指定回数だけ行の挿入を繰り返す
For i = 1 To rowsToInsert
Selection.EntireRow.Insert
' 2行下にカーソルを移動して次の挿入に備える
ActiveCell.Offset(2, 0).Select
Next i
' 画面更新をオンに戻す
Application.ScreenUpdating = True
MsgBox rowsToInsert & "行の空白行を挿入しました。"
End Sub
コードのポイント解説
ActiveCell.Offset(2, 0).Select
この方法の鍵となるコードです。
- まず、現在選択されているセル(
ActiveCell
)の行全体(.EntireRow
)を挿入(.Insert
)します。 - 行を挿入すると、元のデータは1行下にずれます。
- 次の挿入位置(元のデータの次の行)は、現在のカーソル位置から見て2行下になります。
- そこで、
.Offset(2, 0)
(2行下、0列右)でカーソルを移動させ、次のループに備えます。
まとめ
1行おきに行を挿入するには、2つのアプローチがあります。
方法 | 長所 | 短所 |
後ろからループ | 確実で安全。行番号のズレを考慮する必要がない。 | 初心者には少しロジックが分かりにくい場合がある。 |
前からループ | Select とOffset を使い、処理の流れが直感的。 | .Select を多用するため、処理がやや遅く、不安定になる可能性がある。 |
結論として、特別な理由がない限り、行の挿入や削除といった操作は「後ろからループ」で行うのがVBAのベストプラクティスです。これにより、より安定的でメンテナンス性の高いマクロを作成することができます。