前提・実現したいこと
VBAを使って、「A列に入っている数値を項目ごとにカウントし、その個数によって異なる数の空白行を挿入する」というシステムを作っています。
「異なる数の空白行」といいますのは、例えばA列に112222333と縦にデータが入っていたら、11(2×1=2行空白)2222(4×3=12行空白)333といった風に、同じ項目ごとに個数をカウントして(その分)×(その分-1)だけ空白行を挿入したいということです。
まったくのプログラミング初心者なのですが、自分なりにVBAを勉強した結果、「項目ごとに空白行を挿入する」という処理を行うためには、
For i = Range("A" & Rows.Count).End(xlUp).Row To 3 Step -1
という文を使い、下からA列の値をカウントし、iステップ目ととi-1ステップ目でA列に入っている数値が異なる場合に
Rows(i).Insert
という処理を行うのが良いと行き着きました。
しかし、私が作りたいシステムでは、i-1ステップ目に入っている数値の個数をカウントし、その個数によって挿入する空白行を決めたいため、「iステップ目ととi-1ステップ目でA列に入っている数値が異なる場合に」というif文の中にもう一つif文を作り、i-1ステップ目に入っている数値と同じ数値が出てきた回数をカウントして空白行を決定するという処理を付け足しました。
発生している問題・エラーメッセージ
空白行を挿入するという処理自体は上手く出来たのですが、その行数が想定していた数と異なっていました。
例えば、A列に111222333444と同じ項目を3つずつ並べたデータに対して処理を行うと、
111(3×2=6行空白)222(5×4=20行空白)333(7×6=42行空白)444
となり、空白行を決定するカウントがリセット出来ていないようでした。
該当のソースコード
VBA
1Sub macro1() 2 Dim i As Long 3 Dim j As Long 4 Dim k As Long 5 Dim cnt As Long 6 Dim n As Long 7 8 For i = Range("A" & Rows.Count).End(xlUp).Row To 3 Step -1 9 10 If Range("A" & i).Value <> Range("A" & i - 1).Value Then 11 For n = i - 1 To 3 Step -1 12 13 'i行目に挿入する空白行の数を決定するために、i-1行目に入っている数値の出現数をカウント 14 If Range("A" & n).Value = Range("A" & n - 1).Value Then cnt = cnt + 1 15 j = cnt * (cnt - 1) 16 Next n 17 18 '決定した空白行(=j)の分だけ行の挿入を繰り返し 19 For k = 1 To j Step 1 20 Rows(i).Insert 21 Next k 22 cnt = 1 23 24 End If 25 Next i 26 27End Sub 28 29 30 31
試したこと
カウントのリセットを上手く行えていないのではないかと考え、cnt = 1の処理を各行に入れてカウントのリセットを試しましたが、
If Range("A" & n).Value = Range("A" & n - 1).Value Then cnt = cnt + 1
j = cnt * (cnt - 1)
の間にcnt = 1を入れた時以外は同じ結果になりました。
補足情報(FW/ツールのバージョンなど)
Microsoft Office Professional Plus 2019
.xlsm(Excel マクロ有効ブック)
にてMicrosoft Visual Basic for Applications(マクロ)を作成しました。
初心者につきまして、分かりにくいプログラミング文や質問文になってしまいましたが、何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 08:09
2020/11/12 23:40