忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBA】行挿入の鉄則!各行を2行ずつに複製(コピー)する安全なアルゴリズム

Excel VBAで「特定の行をコピーして2行に増やしたい」という場面はよくあります。しかし、単純に上から順に行を挿入すると、無限ループのような挙動やデータのズレに悩まされることになります。今回は、行操作の鉄則である「逆順ループ」を用いて、安全かつ確実にデータを複製する方法を解説します。

1. 仕様:各行を2行ずつに複製(コピー)する

シートにあるデータを、以下のように各行2行ずつに増やす処理を実装します。1行につき1行の空行を挿入し、そこに元の内容をコピーするイメージです。

[ 処理前 ]      [ 処理後 ]
1行目: A        1行目: A
2行目: B   →   2行目: A (コピー)
3行目: C        3行目: B
                4行目: B (コピー)
                5行目: C
                6行目: C (コピー)

2. アルゴリズム:なぜ「下の行から上へ」処理するのか?

重要ポイント:行挿入は「逆順ループ(Step -1)」が鉄則

上から処理すると、新しく挿入した行を「次の処理対象」として誤認してしまい、同じデータを延々とコピーし続ける不具合が起きやすくなります。これを避けるため、最終行から1行目に向かって処理を遡ります。

[ 具体的な動作フロー(3行の場合) ]

Step 1 (i = 3)
3行目の「C」を認識。その直下(4行目)に空行を挿入してコピー。
結果: 1:A, 2:B, 3:C, 4:C (※3行目より下が確定)

Step 2 (i = 2)
2行目の「B」を認識。その直下(3行目)に空行を挿入してコピー。
この時、下の「C」たちは自動的に押し出されますが、カウンタ「i」はすでに上(2)に移動しているため、データが重複することはありません。

Step 3 (i = 1)
1行目の「A」を認識。その直下(2行目)に空行を挿入してコピー。
最終結果: 1:A, 2:A, 3:B, 4:B, 5:C, 6:C

3. サンプルコード(そのままコピーOK)

実務でもそのまま使える、高速化設定(ScreenUpdating)を組み込んだコードです。

Sub DoubleRows()
    Dim lastRow As Long
    Dim i As Long

    ' A列の最終行を取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    ' 画面更新を停止して処理を高速化
    Application.ScreenUpdating = False

    ' 下の行から順に処理(逆順ループ)
    For i = lastRow To 1 Step -1
        ' 現在の行の下に1行挿入
        Rows(i + 1).Insert Shift:=xlDown

        ' 現在の行をコピーして、挿入した空行に貼り付け
        Rows(i).Copy Destination:=Rows(i + 1)
    Next i

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "処理が完了しました!"
End Sub

1. 技術的な補足: 行の削除や挿入を伴う処理では、Step -1(デクリメント)を使うのがVBAのセオリーです。上から処理して「行番号がズレる」というバグは、初心者が最もハマりやすい落とし穴の一つです。
2. エンジニアの視点: この「データの末尾から処理を確定させる」という考え方は、データベース移行(Migration)やスタックの操作など、IT全般に通ずる論理的なアプローチです。シンプルですが、非常に「堅牢(ロバスト)」なコード構造と言えます。


4. まとめ

「行を操作するなら下から上へ」。このルールを一つ覚えるだけで、VBAでのデータ加工の幅は大きく広がります。実行速度を意識した ScreenUpdating の制御と合わせて、ぜひ自身のツールに組み込んでみてください。





PR