エクセルでとあるデータを加工する際に、各行をそれぞれ複数行にコピー(挿入)することが必要だったので、VBAスクリプトで試してみました。
文字で書いているとわかりづらいですが、絵にすると以下のようなことをやります。
今回は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] の開始行を用いて再度 for にて繰り返し処理を行い、[Start_ROW] の行から複製したい行数分だけ行を追加します。↓
そしてこの繰り返し処理が終わったら、 Next で返して、再度同じ処理を繰り返していきます。
For j = Start_ROW To (Start_ROW + Duplicate_Row - 1)
Rows(j).Copy
Rows(j).Insert
Next j
Next i
さいごに
実行してみると処理完了までに少し時間がかかりますが、手動で実施するよりは格段に楽になりました。
処理させる行数が多ければ多いほどスクリプトの “楽さ” を実感できるかと思いますので、同じようなことをしたい場合に参考にしていただければと思います。