【VBA】Excelで1行を複数行にコピーする方法

VBA VBA

エクセルでとあるデータを加工する際に、各行をそれぞれ複数行にコピー(挿入)することが必要だったので、VBAスクリプトで試してみました。

文字で書いているとわかりづらいですが、絵にすると以下のようなことをやります。

A列の値を複数行に複製

今回はA列に存在する値をそれぞれ1行づつ複製しています。(実際には行自体を複製しています)
スクリプト内の値を変えることで、この複製する行数は変更することが可能です。

広告

VBAスクリプト

以下のスクリプトで各行をそれぞれ複数行にコピー(挿入)することが可能です。

Sub Macro1()

Dim i As Long
Dim j As Long
Dim Row_Count As Long
Dim Duplicate_Row As Long
Dim Start_ROW As Long

'最終行を取得(何項目複製するのかを取得)
Row_Count = Cells(Rows.Count, 1).End(xlUp).Row

'それぞれ何行複製するかを定義
Duplicate_Row = 1

    'メイン処理
    For i = 1 To Row_Count
        Start_ROW = i + (Duplicate_Row * (i - 1))
        For j = Start_ROW To (Start_ROW + Duplicate_Row - 1)
            Rows(j).Copy
            Rows(j).Insert
        Next j
    Next i

End Sub
広告

スクリプトの解説

上記のスクリプトを解説していきます。

3~7行目は Dim で変数を定義しています。↓

Dim i As Long
Dim j As Long
Dim Row_Count As Long
Dim Duplicate_Row As Long
Dim Start_ROW As Long

9~10行目では、 A列で値が入っている中の最終行の行番号を取得します。↓
A列の末尾側から一番近く値の入っているセルの行番号=A列の最終行の行番号を取得しています。

'最終行を取得(何項目複製するのかを取得)
Row_Count = Cells(Rows.Count, 1).End(xlUp).Row

12~13行目では、それぞれ何行複製するかを定義します。↓

'それぞれ何行複製するかを定義
Duplicate_Row = 1

15~22行目がメインの処理です。
まず、[Roe_Count] までfor文を用いて繰り返し処理を実行させて、変数 [Start_ROW] を定義します。 ↓
[Start_ROW] は2回目の処理以降に、それ以前の処理で複製した行を飛ばした開始行を定義します。

    For i = 1 To Row_Count
        Start_ROW = i + (Duplicate_Row * (i - 1))
[Start_ROW]の値について

上記で定義した、[Start_ROW] の開始行を用いて再度 for にて繰り返し処理を行い、[Start_ROW] の行から複製したい行数分だけ行を追加します。↓
そしてこの繰り返し処理が終わったら、 Next で返して、再度同じ処理を繰り返していきます。

        For j = Start_ROW To (Start_ROW + Duplicate_Row - 1)
            Rows(j).Copy
            Rows(j).Insert
        Next j
    Next i
行を挿入する位置について
3行挿入された結果
広告

さいごに

実行してみると処理完了までに少し時間がかかりますが、手動で実施するよりは格段に楽になりました。

処理させる行数が多ければ多いほどスクリプトの “楽さ” を実感できるかと思いますので、同じようなことをしたい場合に参考にしていただければと思います。

コメント

タイトルとURLをコピーしました