- ベストアンサー
Excelマクロで条件による行の挿入方法
- Excelのマクロを使用して、条件によって行を挿入する方法をご紹介します。
- 学校のクラス名と氏名が入力されたExcelシートにおいて、指定の条件に従って行を挿入するマクロを作成します。
- マクロを実行することで、指定のクラス名の次に来る行まで空白行を挿入することができます。VBAの知識がなくても利用可能です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 検証が甘くて申し訳ありません。下記でお試し願います。 Sub test() Dim mycell As Range Dim i As Long Application.ScreenUpdating = False Set mycell = Sheets("Sheet1").Range("A1") i = 1 Do Until mycell.Offset(i, 0).Value = "" If mycell.Offset(i, 0).Value Like "*組" Then Set mycell = mycell.Offset(i, 0) Application.CutCopyMode = False '5の倍数なら何もしない様にした If (i Mod 5) <> 0 Then mycell.Resize(((i \ 5) + 1) * 5 - i, 1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove End If i = 1 Else i = i + 1 End If Loop Application.ScreenUpdating = True End Sub
その他の回答 (4)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
質問者さんのご説明で、「5 行区切り」というものの中に、空白行が入っているのかいないのか、の判断がつきませんでした。 「氏名 5 つ」との表現もみられるので、空白を含めれば、6 行ってことかしら?でも質問文の「マクロ実行後」を見ると、「A組」の 5 行下に「B組」が来ているから、6 行になっていないですよね…? 下のコードでは、とりあえず空白を含めて 6 行だと見ています。 使っている数式は若干異なっていますが、2 列を挿入・削除しているという点で、No.1 さんのコードと同じようなものです。 Sub SixRows() Dim lr As Long, i As Long Columns("a:b").Insert Rows(1).Insert lr = Cells(Rows.Count, "c").End(xlUp).Row Range(Range("b2"), Cells(lr, "b")).Formula = "=1+b1*countif(c2,""<>*組"")" Range(Range("a2"), Cells(lr, "a")).Formula = "=b2-1" For i = lr To 3 Step -1 If Cells(i, "a") Mod 5 = 0 Then Rows(i & ":" & i + 4 - Cells(i - 1, "a").Value Mod 5).Insert Next i Columns("a:b").Delete Rows(1).Delete End Sub
- keithin
- ベストアンサー率66% (5278/7941)
「組で終わる」のが組名だという決まり事にします。 丁寧に拾っていけば、そんなに大変なあれやこれやをする事もなさそうです。 sub macro1() dim c as range dim c2 as range ’初期化 if application.countif(range("A:A"), "*組")<2 then exit sub set c = range("A:A").find(what:="*組",lookin:=xlvalues, lookat:=xlwhole, searchdirection:=xlprevious) do ’組ごとループ(下から) set c2 = range("A:A").findprevious(c) if c2.row > c.row then exit do do until (c.row - c2.row) mod 5 = 0 ’5の倍数になるまでループ c.entirerow.insert shift:=xlshiftdown loop set c = c2 loop end sub
- mitarashi
- ベストアンサー率59% (574/965)
シート名は環境に合わせて変更の必要があります。 ご参考まで。 Sub test() Dim mycell As Range Dim i As Long Application.ScreenUpdating = False Set mycell = Sheets("Sheet1").Range("A1") i = 1 Do Until mycell.Offset(i, 0).Value = "" If mycell.Offset(i, 0).Value Like "*組" Then Set mycell = mycell.Offset(i, 0) Application.CutCopyMode = False mycell.Resize(((i \ 5) + 1) * 5 - i, 1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove i = 1 Else i = i + 1 End If Loop Application.ScreenUpdating = True End Sub
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 外しているかもしれませんが・・・ データはA1セルからあり、クラスには必ず「○組」と「組」の文字が入っているという前提です。 Sub 行挿入() Dim i As Long, k As Long, insRow As Long, endRow As Long endRow = Cells(Rows.Count, "A").End(xlUp).Row Application.ScreenUpdating = False Range("A:B").Insert Range("B1") = Range("C1") With Range(Cells(2, "B"), Cells(endRow, "B")) .Formula = "=IF(COUNTIF(C2,""*組""),C2,B1)" .Value = .Value End With With Range(Cells(1, "A"), Cells(endRow, "A")) .Formula = "=COUNTIF(B$1:B1,B1)" .Value = .Value End With For i = endRow + 1 To 2 Step -1 If Cells(i, "B") <> Cells(i - 1, "B") Then insRow = 5 - (Cells(i - 1, "A") Mod 5) Rows(i & ":" & i + insRow - 1).Insert ElseIf Cells(i, "A") Mod 5 = 0 Then Rows(i + 1).Insert End If Next i Range("A:B").Delete Application.ScreenUpdating = True End Sub こんな感じでよいのでしょうかね?m(_ _)m
補足
mitarashiさんのコードを使わせてもらい、 ほぼ理想の動きにはなりました。 ただ、ちょうど5行づつの区切りになった場合 A組 あ あ あ あ B組 い い い と何もない行が5行続いてしまうのが難点です。 VBAの勉強はじめてはみたのですがまだ私には 直せるような技術はないのでまだこちらを見ていたらご教授願います。