- ベストアンサー
【excle VBA】欠品時の空白行の自動挿入方法を教えてください
- 欠品のある月に空白の行を挿入する方法を教えてください。ただし、欠品は商品ごとに異なる月に発生するため、確定した列に記載されているわけではありません。商品は何千点もあるため、相対参照で行いたいです。
- また、今回の対応範囲は12月までですが、将来的には13月(1月)、14月(2月)までの対応もしたいです。改善策も教えていただけると助かります。
- 理想的な表は、欠品のある月に商品名をコピーして挿入し、空白の行を作ります。これにより、欠品のある月の次に商品名を表示することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
結構面倒な処理になりました。 質問文の説明がよく理解できないので期待する結果にならないかもしれません。またA列の月は日付型ではなく単純に整数が入力されているものと想定しています。 最大月数を変えるには2行目を変更してください Sub Macro1() Const mMax As Integer = 12 '最大月数を指定する Dim m, ptr As Integer Dim goods As String Application.ScreenUpdating = False ActiveSheet.Copy Before:=ActiveSheet m = mMax goods = Range("B65536").End(xlUp).Value For ptr = Range("A65536").End(xlUp).Row To 1 Step -1 If Cells(ptr, "B").Value = goods Then Do While Cells(ptr, "A").Value < m Call rtn(m, goods, ptr) m = m - 1 Loop Else Do While m > 0 Call rtn(m, goods, ptr) m = m - 1 Loop m = mMax goods = Cells(ptr, "B").Value Do While Cells(ptr, "A").Value < m Call rtn(m, goods, ptr) m = m - 1 Loop End If If ptr > 1 Then m = Cells(ptr, "A").Value - 1 End If Next ptr Application.ScreenUpdating = True End Sub Sub rtn(ByVal m As Integer, goods As String, ptr As Integer) Rows(ptr + 1).Insert Cells(ptr + 1, "A").Value = m Cells(ptr + 1, "B").Value = goods End Sub 結果はこうなりました 月 商品 価格 割引 1 牛乳 2 牛乳 3 牛乳 100円 5% 4 牛乳 120円 3% 5 牛乳 6 牛乳 112円 4% 7 牛乳 8 牛乳 9 牛乳 10 牛乳 100円 5% 11 牛乳 12 牛乳 1 卵 2 卵 3 卵 4 卵 100円 5% 5 卵 120円 3% 6 卵 7 卵 8 卵 112円 4% 9 卵 10 卵 11 卵 12 卵
その他の回答 (1)
- zap35
- ベストアンサー率44% (1383/3079)
#01です >3(月)からにしたいのですが、 16行目を以下に置き換えればよいです。 Do While m > 2 別の方法でも考えてみました。こちらの方が考え方がシンプルになり、その分処理も速いと思います。 Sub Macro2() Const mMax As Integer = 12 '最大月数を指定する Const fMonth As Integer = 3 '開始月 Dim m, ptr As Integer, goods As String Dim sh As Worksheet, r As Range Application.ScreenUpdating = False Set sh = ActiveSheet Worksheets.Add Before:=ActiveSheet sh.Rows(1).Copy Range("A1") With sh For ptr = .Range("A65536").End(xlUp).Row To 2 Step -1 If .Cells(ptr, "B").Value <> goods Then goods = .Cells(ptr, "B").Value Rows("2:" & mMax - fMonth + 2).Insert Range("A2").Value = fMonth Range("A2").AutoFill Destination:=Range("A2").Resize(mMax - fMonth + 1), Type:=xlFillSeries Range("B2").Resize(mMax - fMonth + 1).Value = goods End If Set r = Range("A2").Resize(mMax - fMonth + 1).Find(what:=.Cells(ptr, "A").Value, _ LookIn:=xlValues, Lookat:=xlWhole) If Not r Is Nothing Then .Cells(ptr, "C").Resize(1, 2).Copy r.Offset(0, 2) End If Next ptr End With Application.ScreenUpdating = True End Sub
お礼
さらに提案いただきありがとうございます! macro2で行ってみました。おっしゃるとおり早かったです。しかしD列までのコピーで実際はAZ列ぐらいまでのデータなので、そこを変更する仕方が分からず・・・macro1の >>Do While m > 2 を変更して利用することができました! zap35先生、本当にありがとうございました!
お礼
ありがとうございます!!!できました。 とても複雑なマクロを作成していただきまして、誠にありがとうございます! 一気に仕上げるようにしていただけました。 ちなみに、1(月)からではなく、3(月)からにしたいのですが、どちらを変更すればできますでしょうか。