VBAで複数の行を挿入後、挿入以外を削除する方法

このQ&Aのポイント
  • VBAを使用して、指定したセルの下に複数の行を挿入する方法について説明します。また、挿入した行以外を削除する方法も紹介します。
  • 具体的な手順としては、まず「挿入」シートに数字が1から順に並んでいる状態を作ります。次に、「入力」シートに挿入する行の数や色などを指定し、マクロを実行します。すると、「挿入」シートの指定したセルに指定した行数の行が挿入されます。
  • 最後に、マクロ実行後に「挿入」シートの指定した行以外を削除する方法を紹介します。これにより、指定した行以外の不要なデータを削除することができます。
回答を見る
  • ベストアンサー

VBA 複数の行を挿入後、挿入以外を削除その2

先回はごちゃごちゃしていました。 https://okwave.jp/qa/q9540698.html 今回はwatabe007様より、ヒントを得て、やり易くするように流れを変えました。 ●「挿入」シートにナンバーの数字が1~(100以上)と順次に並んでいます。 「挿入」シート  1  2  3  4  5  6  7  8  9  10  ・  ・  ・  100くらい ●「入力」シートにナンバーの数字、行挿入の数、色分けの三つあります。 「入力」シート ナンバー 挿入する行の数 色   4      5     赤   6      3     黄色  8      4     緑  9      1     青 上記を入力し、マクロ実行すると「挿入」シートのナンバー4に5行挿入、6に3行挿入、8に4行挿入、9に1行挿入 「挿入」シート  1  2  3  4 (行挿入) (行挿入) (行挿入) (行挿入) (行挿入)  5  6 (行挿入) (行挿入) (行挿入)  7  8 (行挿入) (行挿入) (行挿入) (行挿入)  9 (行挿入)  10  ・  ・  100くらい マクロ実行で、シート名「入力」に記載していたナンバーと挿入した行以外を削除 「挿入」シート  4 (行挿入) (行挿入) (行挿入) (行挿入) (行挿入)  6 (行挿入) (行挿入) (行挿入)  8 (行挿入) (行挿入) (行挿入) (行挿入)  9 (行挿入) といった流れが望ましいです。 宜しくお願いします。

  • nkmyr
  • お礼率67% (403/600)

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.7

>入力シートに4の数字があったら挿入シートのA列に順次に並べている >4の数字と一致したら、行を挿入するといった流れです Sub Test4()   Dim NewSheet As Worksheet, V As Variant   Dim i As Long, 行 As Long, myR As Variant   Application.ScreenUpdating = False   With Worksheets("入力")     V = .Range("A2:B" & .Cells(1, 1).End(xlDown).Row)   End With   Set NewSheet = Worksheets.Add(Before:=Worksheets("挿入"))   With Worksheets("挿入")     .Rows(1).Copy     NewSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteColumnWidths     NewSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteAll     NewSheet.Cells(1, 1).Select     行 = 2     For i = 1 To UBound(V)       myR = Application.Match(V(i, 1), .Columns(1), 0)       If IsError(myR) Then         MsgBox V(i, 1) & " が見つかりません。"         Exit Sub       End If       .Rows(myR).Copy NewSheet.Cells(行, 1)       行 = 行 + V(i, 2) + 1     Next   End With   Application.DisplayAlerts = False   Worksheets("挿入").Delete   Application.DisplayAlerts = True   NewSheet.Name = "挿入"   Application.CutCopyMode = False   Application.ScreenUpdating = False   MsgBox "処理終了" End Sub

nkmyr
質問者

お礼

おかげ様でうまくできました。 最後まで付き合ってくださりありがとうございました。

その他の回答 (6)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

>一行分ずれているようです。 「入力」シート ナンバー 挿入する行の数 色   4      5     赤   6      3     黄色  8      4     緑  9      1     青 ナンバーに書かれている4は、4行目に挿入する事でしょ その後、1行目に項目行を増やしたのだから 1行増やして5と書かなければならないのでは 5  5 7  3 9  4 10  1

nkmyr
質問者

補足

ややこしくてすみません。 4、6、8、9とかは行目ではなく、数字です。 入力シートに4の数字があったら挿入シートのA列に順次に並べている4の数字と一致したら、行を挿入するといった流れです。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

番外編 Sub 別案()   Dim NewSheet As Worksheet, V As Variant   Dim i As Long, 行 As Long   Application.ScreenUpdating = False   With Worksheets("入力")     V = .Range("A2:B" & .Cells(1, 1).End(xlDown).Row)   End With   Set NewSheet = Worksheets.Add(Before:=Worksheets("挿入"))   With Worksheets("挿入")     .Rows(1).Copy     NewSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteColumnWidths     NewSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteAll     NewSheet.Cells(1, 1).Select     行 = 2     For i = 1 To UBound(V)       .Rows(V(i, 1)).Copy NewSheet.Cells(行, 1)       行 = 行 + V(i, 2) + 1     Next   End With   Application.DisplayAlerts = False   Worksheets("挿入").Delete   Application.DisplayAlerts = True   NewSheet.Name = "挿入"   Application.CutCopyMode = False   Application.ScreenUpdating = False   MsgBox "処理終了" End Sub

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

Sub Test3()   Dim ws1 As Worksheet, ws2 As Worksheet   Dim myR As Long, n As Long, n2 As Long   Dim i As Long, j As Long   Dim myCol As Long, flg As Boolean   Dim LR As Long, ER As Long, SR As Long   Application.ScreenUpdating = False   Worksheets("挿入").Activate   Set ws1 = Worksheets("入力")   Set ws2 = Worksheets("挿入")    '行挿入処理   For i = ws1.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1     j = j + 1     myR = ws1.Cells(i, 1).Value + 1     n = ws1.Cells(i, 2).Value     ws2.Rows(myR).Resize(n).Insert     ws2.Cells(myR, 1).Resize(n).Interior.Color = vbRed     ER = ER + n     If j = 1 Then ER = ER + ws1.Cells(i, 1).Value   Next   '行削除処理   SR = ws1.Range("A2").Value   LR = ws2.Cells(Rows.Count, "A").End(xlUp).Row   If LR < ER + 1 Then LR = ER + 1   ws2.Range(ER + 1 & ":" & LR).Delete   ws2.Range(2 & ":" & SR - 1).Delete   For i = ER To 2 Step -1     If ws2.Cells(i, 1).Interior.ColorIndex = xlNone And flg = True Then       ws2.Rows(i).Delete     ElseIf ws2.Cells(i, 1).Interior.ColorIndex = xlNone Then       flg = True     Else       ws2.Cells(i, 1).Interior.ColorIndex = xlNone       flg = False     End If   Next   Application.ScreenUpdating = True   MsgBox "処理終了" End Sub

nkmyr
質問者

補足

ありがとうございます。 たびたびですみません。 ナンバー 挿入する行の数  4      5      6      3       8      4       9      1      上記でマクロ実行しましたところ、以下が結果です。 ナンバー 挿入した行の数  3      5      5      3       7      4       8      1 一行分ずれているようです。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>●挿入シートのセル1行目は名称をつけておき、マクロ実行はセル2行目から. >にしたいのですが、その場合はコードのどこを変更したら良いでしょうか? これは、全作業完了後に1行目を挿入すれば良いでしょう ●セルのカラーを省いたい場合はコードのどこを削除したら良いでしょうか? カラーを省いたい場合とは挿入行に着色しないのですか?

nkmyr
質問者

補足

コメントありがとうございます。 挿入シートは最初からA1セルに名称があります。 A2から1,2,3…と順次に並べていますので、A2からマクロ実行できると思いました。A1から実行なので、名称が消えてしまっています。 色は見分け確認のためでつけてもらいました。実際は不要になりますので、 myCol = ws1.Cells(i, 3).Interior.Color ws2.Rows(myR).Resize(n).Interior.Color = myCol をどちらかを削除したり、片方を削除しても真っ黒になったり、真っ白になったり、削除の行がバラバラだったりとしています。 こちらの力では解決できませんでした。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

Sub Test()   Dim ws1 As Worksheet, ws2 As Worksheet   Dim myR As Long, n As Long, n2 As Long   Dim i As Long, j As Long   Dim myCol As Long, flg As Boolean   Dim LR As Long, ER As Long, SR As Long   Application.ScreenUpdating = False   Worksheets("挿入").Activate   Set ws1 = Worksheets("入力")   Set ws2 = Worksheets("挿入")   '行挿入処理   For i = ws1.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1      j = j + 1     myR = ws1.Cells(i, 1).Value + 1     n = ws1.Cells(i, 2).Value     myCol = ws1.Cells(i, 3).Interior.Color     ws2.Rows(myR).Resize(n).Insert     ws2.Rows(myR).Resize(n).Interior.Color = myCol     ER = ER + n     If j = 1 Then ER = ER + ws1.Cells(i, 1).Value   Next   '行削除処理   SR = ws1.Range("A2").Value   LR = ws2.Cells(Rows.Count, "A").End(xlUp).Row   If LR < ER + 1 Then LR = ER + 1   ws2.Range(ER + 1 & ":" & LR).Delete   ws2.Range(1 & ":" & SR - 1).Delete   For i = ER - SR + 1 To 2 Step -1     If ws2.Cells(i, 1).Interior.ColorIndex = xlNone And flg = True Then       ws2.Rows(i).Delete     ElseIf ws2.Cells(i, 1).Interior.ColorIndex = xlNone Then       flg = True     Else       flg = False     End If   Next   Application.ScreenUpdating = True End Sub

nkmyr
質問者

補足

毎回ありがとうございます。 お陰様で動作できました。 質問ですが。 ●挿入シートのセル1行目は名称をつけておき、マクロ実行はセル2行目からにしたいのですが、その場合はコードのどこを変更したら良いでしょうか? ●セルのカラーを省いたい場合はコードのどこを削除したら良いでしょうか? 宜しくお願いします。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

さて、今回はどうでしょう Sub Test()   Dim ws1 As Worksheet, ws2 As Worksheet   Dim myR As Long, n As Long, myCol As Long   Dim j As Long, i As Long, n2 As Long   Application.ScreenUpdating = False   Worksheets("挿入").Activate   Set ws1 = Worksheets("入力")   Set ws2 = Worksheets("挿入")    '行挿入処理   For i = ws1.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1     j = j + 1     myR = ws1.Cells(i, 1).Value + 1     n = ws1.Cells(i, 2).Value     myCol = ws1.Cells(i, 3).Interior.Color     ws2.Rows(myR).Resize(n).Insert     ws2.Rows(myR).Resize(n).Interior.Color = myCol     If j = 1 Then       ws2.Cells(myR, 1).NoteText "END"       n2 = ws1.Cells(i, 2).Value     End If   Next   '行削除処理   Dim LR As Long, ER As Long, SR As Long   SR = ws1.Range("A2").Value   LR = ws2.Cells(Rows.Count, "A").End(xlUp).Row   For i = LR To 2 Step -1     If Cells(i, 1).NoteText = "END" Then       ER = i       Exit For     End If   Next   ws2.Cells(ER, 1).ClearComments   ws2.Range(ER + n2 & ":" & LR).Delete   ws2.Range(1 & ":" & SR).Delete   Application.ScreenUpdating = True End Sub

関連するQ&A

  • VBA 複数の行を挿入後、挿入以外を削除その3

    しつこくてすみません。 https://okwave.jp/qa/q9541345.html このときは大変お世話になりました。 作業しているうちに間違いに気付きました。 また皆さまの力をおかり下さい。 ナンバー  挿入する行の数  4       5 6       3 8       4 9       1 挿入する行の数は5ですが、ナンバー4の行と合わせると6行になります。 なので「挿入する行の数」は5と記載しても行の挿入は-1の4を挿入してナンバー4の行と合わせて5行になるといったものが望ましいです。 ナンバー  挿入する行の数  4       5(4を挿入) 6       3(3を挿入) 8       4(3を挿入) 9       1(0なので、挿入しない) 最後にもしナンバー9に10行を入れたとしたらどこまで行が挿入されたか、分からなくなります。(やはり色が付いた方が分かると思いますが…) 最後に行を挿入した行の下に「ここまで」と記載した方が分かりやすいかと思いますが、コードの記述方法を教えて頂けたらと思います。 宜しくお願いします。

  • VBA 複数の行を挿入後、挿入以外を削除

    知恵をお借りください。 A10に5行分挿入、A13に2行分挿入、A14に1行分挿入、A16に2行分挿入 以下がコードです。 Dim n As Long n = Worksheets("Sheet1").Range("A1").Value With Worksheets("Sheet2") .Range("A10").Resize(n).EntireRow.Insert .Range("A10").Resize(n).EntireRow.Interior.Color = vbYellow .Activate End With Dim k As Long k = Worksheets("Sheet1").Range("A2").Value With Worksheets("Sheet2") .Range("A13").Resize(n).EntireRow.Insert .Range("A13").Resize(n).EntireRow.Interior.Color = vbRed .Activate End With Dim m As Long m = Worksheets("Sheet1").Range("A5").Value With Worksheets("Sheet2") .Range("A14").Resize(n).EntireRow.Insert .Range("A14").Resize(n).EntireRow.Interior.Color = vbGreen .Activate End With Dim ka As Long ka = Worksheets("Sheet1").Range("A10").Value With Worksheets("Sheet2") .Range("A16").Resize(n).EntireRow.Insert .Range("A16").Resize(n).EntireRow.Interior.Color = vbBlue .Activate End With マクロ実行後、行の並び方がバラバラになっています。 ↓イメージ図 https://mega.nz/#!yUwXHTLK!TSZvMJ1CaiTi-OoX-1j9IeNleuXesrzU5O7o2vG-svI 理想図に整えるにはどうすれば良いのでしょうか? また、マクロで行を挿入したら、不要な行を削除するコードも教えてくださればありがたいです。 ↓イメージ図 https://mega.nz/#!fMRDAKAJ!GHMpiagpn-O_0aaMhrHOozFd8WHHkSQzOS-fSCInw-g 宜しくお願いします。

  • 複数行に空白行を一括で挿入したいのですが

    エクセルに関する質問です。 セルA列の14行目から30000行まである数字が入力されています。 各行間に一行ずつ空白行を挿入したのですが マクロを使ったやりかたでもかまいませんので 一括でする方法があれば教えていただけないでしょう?

  • VBAで行コピーして挿入

    1行目の内容をコピーして、他の場所に指定数分だけ 挿入するマクロを作りました。 そのマクロ自体は、正しく動いたのですが、コピー元の1行目に 他のシートを参照する関数が入っていた場合、想定どおりの 結果を得ることができません。 [SHEET1:データのみを記載] 省略 [SHEET2] A1セル:   =SHEET1!$A1 ←コピー元の行 [マクロ:一部抜粋] myR = Application.InputBox("挿入する行数を入れてください", , "1") For i = 1 To myR   Rows("1:1").Copy   Cells(ActiveCell.Row, 1).Select   Selection.Insert Shift:=xlDown   Selection.EntireRow.Hidden = False Next i どういう結果を求めたいかというと、たとえば、 SHEET2のA10セル上で、このマクロを実行し、 "挿入行 = 3" と指定したら A10:   =SHEET1!$A10 A11:   =SHEET1!$A11 A12:   =SHEET1!$A12 となってほしかったのですが、結果は、 A10:   =SHEET1!$A10 A11:   =SHEET1!$A10 A12:   =SHEET1!$A10 となってしまいました。 どうにか、求める結果を得られるようにできないでしょうか?

  • 数値を入力、ボタンをクリックして行を挿入

    下記はA1に「5」を入力し、マクロを実行すると、A10行より5行分挿入するといったコードですが、シート1のA1に「5」を入力し、マクロを実行するとシート2のA10行より5行分挿入するといったコードを教えてくれませんか? 宜しくお願いします。 Sub Test() Range("A10").Resize(Range("A1").Value).EntireRow.Insert End Sub

  • 選択中の行に「行」を挿入するマクロ

    エクセルのいちばん左(1から数字が縦に並んでいるところ)の任意の 数字を選択してその行を全選択しておいた状態でマクロを実行すると、そこに1行挿入するプログラムを教えてください。

  • エクセルで1行ごとに空白行を挿入し、挿入した空白行に色をつけたいです

    タイトルの通りです。 エクセル(2000)で、データはシート毎に件数が違います。 各シート毎にそれぞれ1行毎、空白行を挿入し、挿入した空白行のA列~G列までに薄いグレーの色をつけるマクロを入れたいのですが、うまくいきません。 詳しい方、教えて下さい。

  • ExcelVBA 複数のシートへの行挿入

    現在下記の操作を行いたい為、Excelマクロを作成しています。 Sheet1のアクティブセルの行に(AからN列の)行の挿入 Sheet2から4はSheet1のアクティブセルの行+2の(AからN列の)箇所に行の挿入 Sheet5は行挿入を行わない。 このような操作をマクロで行う事は可能でしょうか。 またどのように記述すればよろしいでしょうか。 よろしくお願い致します。 例: Sheet1のアクティブセル = A3の場合 Sheet1 = A3からN3まで行挿入 Sheet2から4はA5からN5まで行挿入 Sheet5は行挿入を行わない。 現在ここまで作成しています。 Sub Add() ActiveCell.Offset().Activate ActiveCell.EntireRow.Range("a1:n1").Insert Shift:=xlDown End Sub

  • VBAでの行挿入について

    Excel VBAの条件に合った場合、行挿入&挿入した行のセルに特定の値を入力 VBA初心者です。Excel2007、XPを使用しています。 A列からCK列、平均100行程度の顧客データがあります。 このデータは列数は変わりませんが、行数は毎回異なり、 1行1顧客ではなく、同じ顧客で数行で入ることがあります。 しかしA列の顧客番号で判別できるようにはなっています。 目標は下記の点です。 「BC列」に値がある場合、 1行下へ空白行を挿入(できればA~X、Z~AA、AD~CKは1行上と同じ)。 但し挿入する位置は、顧客情報の一番下(1行の場合は2行目、2行の場合は3行目と)です。 挿入した行のY列に「ポイント利用」と入力。 挿入した行のAC列に「BC列の値」を入力。 挿入した行のAB列に「1」を入力。 「BJ列」に値がある場合、 1行下へ空白行を挿入(できればA~X、Z~AA、AD~CKは1行上と同じ)。 但し挿入する位置は、顧客情報の一番下(1行の場合は2行目、2行の場合は3行目と)です。 挿入した行のY列に「送料」と入力。 挿入した行のAC列に「BJ列の値」を入力。 挿入した行のAB列に「1」を入力。 以降に必要な処理はマクロで作成できたのですが、 その後に上記項目を手作業で処理しているのも限度があるので、 最初に挿入処理できればと思ってます。 分かりづらい説明だとは思いますが、 何卒ご教授頂きたくお願い致します。

  • 関数が含まれたセルの行をマクロで挿入する

    セルD2には、IF関数が含まれている、以下の表があります。2行目に行をマクロで挿入して大きな表を作成する予定です。        A       B       C      D      1    納入数   使用m数   納入m   使用m 2                           〔=if(B2>1,C2,"")〕 マクロは、以下のようにして、2行目に行を挿入したのですが、IF文が含まれたものが 挿入できません。どのようなマクロ文にしたらよいかわからず困っています。別シートからコピーする 方法も考えられますが、同じシート内で収めたいと考えています。宜しくお願いします。 Sub 行挿入() ' ' 行挿入 Macro ' ' Range("a2:d2").Insert copyorigin:=xlFormatFromRightOrBelow End Sub

専門家に質問してみよう