Excelマクロで条件による行の挿入方法

このQ&Aのポイント
  • Excelのマクロを使用して、条件によって行を挿入する方法をご紹介します。
  • 学校のクラス名と氏名が入力されたExcelシートにおいて、指定の条件に従って行を挿入するマクロを作成します。
  • マクロを実行することで、指定のクラス名の次に来る行まで空白行を挿入することができます。VBAの知識がなくても利用可能です。
回答を見る
  • ベストアンサー

excelのマクロで条件による行の挿入

列AとBがあり列Aに学校のクラス名A組、B組、C組・・・(20クラスほど)と氏名が 入るエクセルシートがあるのですが 先頭行はA組から始まり5行区切りで数え、(A組も5行のうちに入る) その5行内に次のB組が入らないように空白行を挿入したいです もし、5行以内にB組がない場合、次の5行でまたB組があるか判定しなければ氏名5つ あれば空白をいれてというのを20クラスぶん作るマクロは可能でしょうか? VBAの知識がさっぱりないので途方にくれています。 元のデータの例   マクロ実行後 列A   列B      列A   列B A組           A組   氏名1 111      氏名1 111  氏名2 222      氏名2 222 B組           空白行挿入 氏名3 333      空白行挿入 氏名4 444      B組 氏名5 555      氏名3 333 氏名6 666      氏名4 444 氏名7 777      氏名5 555 C組 氏名6 666              氏名7 777              空白行挿入              空白行挿入              空白行挿入              空白行挿入              C組  

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.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)

回答No.4

質問者さんのご説明で、「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/7940)
回答No.3

「組で終わる」のが組名だという決まり事にします。 丁寧に拾っていけば、そんなに大変なあれやこれやをする事もなさそうです。 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)
回答No.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 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

iori88
質問者

補足

mitarashiさんのコードを使わせてもらい、 ほぼ理想の動きにはなりました。 ただ、ちょうど5行づつの区切りになった場合 A組 あ あ あ あ B組 い い い と何もない行が5行続いてしまうのが難点です。 VBAの勉強はじめてはみたのですがまだ私には 直せるような技術はないのでまだこちらを見ていたらご教授願います。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 外しているかもしれませんが・・・ データは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

関連するQ&A

  • エクセルのマクロ(行を挿入し連番を振る)

    ボタンを押すと以下のことを実行するマクロを作成することはできますか? A列2行目から 書類a 書類b 書類c 書類d 書類e C列2行目から 5 3 2 4 3 と入っています。C列は各書類の枚数です。 ボタンを押すと書類aと書類bの間に4行空白行が挿入され、A列とC列は増やした4行にそれぞれ書類a、5がコピーされ、B列には2列目から6列目まで1.2.3.4.5と連番が振られる。 というマクロです。 B列C列で1/5 2/5 3/5 4/5 5/5 であるという表現がしたいのです。(/は入りません) 書類が1枚の場合はB列C列共に空白で1/1とは入りません。 C列に入る書類の枚数により行が挿入されその書類の枚数分の連番が振られるようなマクロが作りたいです。 毎日何百行も手作業で挿入しコピーし連番を振る作業をしています。 決まった行数を増やすとか上の行をコピーするマクロならわかるのですが、C列の値を見て挿入する行数を判断するようなマクロができるのかわかりません。 どなたか教えて頂けないでしょうか。

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • エクセルマクロ、集計行の上に空白行挿入

    エクセルデータがA、B、C、D、E列1000行まであります。 C列基準でE列を合計するマクロを作成しましたが(集計行はデータの下に挿入)、実行の結果、新たに挿入される集計行の上に空白行を1行挿入していくということを、作成したマクロに付加できるでしょうか? ご教授頂きたく、お願いします。

  • エクセル行の挿入

    excelに行を追加する方法を教えてください! Bにある数からマイナス1行下に挿入したいのです。 1→挿入なし  2→下に1行挿入  3→下に2行挿入 数よりマイナス1行の挿入をしたいのですが、 マクロ、関数など全く分かりません。 以前の質問も見てみたのですが、見当たらないのと、 マクロ?が全くわからないので、 どなたか一から教えていただけないでしょうか? 本当に申し訳ないのですが、お願いします。 Aにkkkk Bに数が入ります。   A | B | C | D ------------------------------------- 1| kkkk   2 ------------------------------------- 2| kkkk   1 ------------------------------------- 3| kkikk   3 ------------------------------------- 4| kkkk   2 ↓行の挿入   A | B | C | D ------------------------------------- 1| kkkk   2 ------------------------------------- 2| kkkk   空白(行の挿入) ------------------------------------- 3| kkikk   1 ------------------------------------- 4| kkkk   3 ------------------------------------- 5| kkkk   空白(行の挿入) ------------------------------------- 6| kkkk   空白(行の挿入) ------------------------------------- 7| kkkk   2 ------------------------------------- 8| kkkk   空白(行の挿入) -------------------------------------

  • エクセルマクロにて条件比較後にセル挿入をしたい

    下記の様な表(処理前)があるとします。 2行目から行毎に"A列 = C列 AND B列 = D列"という比較を行い、 TRUEなら次の行へ、FALSEなら該当行のC列とD列に 空白セルを挿入し(処理後の表の様にしたいです)次の行へ進む という処理をマクロにて実現したいです。 どのようなマクロを組めば宜しいでしょうか?ご教授お願い致します。 <処理前> A列 B列 C列 D列 東京 斎藤 東京 斎藤 東京 田中 東京 後藤 東京 伊藤 東京 井上 東京 後藤 東京 三沢 東京 井上 大阪 田中 東京 三沢 <処理後> A列 B列 C列 D列 東京 斎藤 東京 斎藤 東京 田中 <両列に空白セル挿入> 東京 伊藤 <両列に空白セル挿入> 東京 後藤 東京 後藤 東京 井上 東京 井上 大阪 田中 <両列に空白セル挿入> 東京 三沢 東京 三沢

  • 行挿入マクロをご教示ください

    A列の5行目から1000行ほどK列までデータが入っています。 A列からK列をB列優先でソートを行うと、B列にところどころ同じ番号が2行あったり、3行あったり、また4行とバラバラで、出てきます。 この場合、同じ番号が2行以上あるセルの上に空白の行1行を挿入し、同じ番号行分を合計して整理したいと考えています。 2行以上ある行の上に空白行を1行挿入するようなマクロをご教示ください。 どなたか、よろしくお願いします。

  • ”アクティブセル行」の一行下を選択”するマクロ

    ■ ”アクティブセルの、1個下の行を選択し、新しい空白行を一行挿入” ■次にその”アクティブセルのA列とB列の値を、  新しく作った空白行に、コピー  ・・・といったマクロを組もうとしております。 たとえば 12行目を選択するプログラム(コマンド?マクロ?)は、  Rows(12:12) となっていたので、それにならって Rows(activecell:B) などとやってみたのですが、うまくいきませんでした。 このような場合、どうしたらよいのかアドバイスをいただけると助かります。 どうぞ、よろしくお願いいたします。  

  • エクセル 行挿入のマクロについて

    こんばんは、エクセルのマクロについてお伺いします。 現在 A1:支店名 B1:連番 C1:在庫数 全部で1000行位入力があります。 ・A列には支店名 ・B列には連番は1・2・3~と1000件位 ・c列には在個数にはそれぞれ1桁から2桁の数字 【質問】 在庫数の数だけその連番の行を増やしたい。 例えば、 A2:東京支店 B2連番:1 C2在庫数:3 だとすると2行目のあとに2行挿入し在庫数が3なので下記のように3行にしたい。 A2 東京支店 B2連番 1 C2 在庫数 1 A3 東京支店 B3連番 1 C3 在庫数 空欄 A4 東京支店 B4連番 1 C4 在庫数 空欄 何せ数が多いのでマクロをお教え頂ければ助かります。 ※その際、支店名と連番は同じ物がはいるとありがたいです。 ※在庫数は空欄で構いません。 マクロでなくても方法があればお教え下さい。 よろしくお願い致します。

  • 条件にあてはまる場合、行挿入+値を移動させるマクロ

    Excel2003、WindowsXPを使用しています。 説明が分かり難いところがあるかもしれませんが、よろしくお願いいたします。 1.C列に値が入っていた場合、下に行を挿入。 2.挿入した行のB列に、C列に入っていた値を移動。 3.D列に値が入っていた場合、さらにその下に行を挿入。 4.挿入した行のB列に、D列に入っていた値を移動。 5.E列に値が入っていた場合、さらにその下に行を挿入。 6.挿入した行のB列に、E列に入っていた値を移動。 というように、C-E列に値が入っていた場合、下に行を挿入し、 挿入行にその値を移動させるマクロを教えてください。 (実行前)    A列     B列  C列  D列  E列   F列 ああああ  AAA  BBB  CCC  DDD  12222 うううう    EEE                   544 くくく     FFF  GGG  VVV        8 すす     TTT   BBB            4300 (実行後)  A列     B列   C列 ああああ  AAA   12222 ああああ  BBB   12222 ああああ  CCC   12222 ああああ  DDD   12222 うううう    EEE    544 くくく     FFF    8 くくく     GGG   8 くくく     VVV    8 すす     TTT    4300 すす     BBB   4300 上記実行後のように、マクロで出来たら…と思っています。 どうぞよろしくお願いいたします。

  • Excelのマクロで質問します

    A列には氏名が入っています。 B列には性別が入っています。(例えば男なら○印,女なら空白) そこで,B列に○があれば男の列(C列)に,空白なら女の列(D列)に それぞれ上から(1行目から)氏名を入力していくようにしたいです。 (つまり,C1は男の1番,C2は男の2番・・・・・,D1は女の1番,D2は女の2番・・・という感じです。) このようなマクロについて,どなたか教えてください。 ちなみに1000行ぐらいまでデータがあるとします。

専門家に質問してみよう