• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【excle VBA】抜け番号の空白の行を自動に挿入したい)

【excle VBA】欠品時の空白行の自動挿入方法を教えてください

このQ&Aのポイント
  • 欠品のある月に空白の行を挿入する方法を教えてください。ただし、欠品は商品ごとに異なる月に発生するため、確定した列に記載されているわけではありません。商品は何千点もあるため、相対参照で行いたいです。
  • また、今回の対応範囲は12月までですが、将来的には13月(1月)、14月(2月)までの対応もしたいです。改善策も教えていただけると助かります。
  • 理想的な表は、欠品のある月に商品名をコピーして挿入し、空白の行を作ります。これにより、欠品のある月の次に商品名を表示することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

結構面倒な処理になりました。 質問文の説明がよく理解できないので期待する結果にならないかもしれません。また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   卵

gclef19
質問者

お礼

ありがとうございます!!!できました。 とても複雑なマクロを作成していただきまして、誠にありがとうございます! 一気に仕上げるようにしていただけました。 ちなみに、1(月)からではなく、3(月)からにしたいのですが、どちらを変更すればできますでしょうか。

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#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

gclef19
質問者

お礼

さらに提案いただきありがとうございます! macro2で行ってみました。おっしゃるとおり早かったです。しかしD列までのコピーで実際はAZ列ぐらいまでのデータなので、そこを変更する仕方が分からず・・・macro1の >>Do While m > 2 を変更して利用することができました! zap35先生、本当にありがとうございました!

関連するQ&A