VBAで複数の行を挿入後、挿入以外を削除する方法
- 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)
- Visual Basic
- 回答数7
- ありがとう数2
- みんなの回答 (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
その他の回答 (6)
- watabe007
- ベストアンサー率62% (476/760)
>一行分ずれているようです。 「入力」シート ナンバー 挿入する行の数 色 4 5 赤 6 3 黄色 8 4 緑 9 1 青 ナンバーに書かれている4は、4行目に挿入する事でしょ その後、1行目に項目行を増やしたのだから 1行増やして5と書かなければならないのでは 5 5 7 3 9 4 10 1
補足
ややこしくてすみません。 4、6、8、9とかは行目ではなく、数字です。 入力シートに4の数字があったら挿入シートのA列に順次に並べている4の数字と一致したら、行を挿入するといった流れです。
- watabe007
- ベストアンサー率62% (476/760)
番外編 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)
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
補足
ありがとうございます。 たびたびですみません。 ナンバー 挿入する行の数 4 5 6 3 8 4 9 1 上記でマクロ実行しましたところ、以下が結果です。 ナンバー 挿入した行の数 3 5 5 3 7 4 8 1 一行分ずれているようです。
- watabe007
- ベストアンサー率62% (476/760)
>●挿入シートのセル1行目は名称をつけておき、マクロ実行はセル2行目から. >にしたいのですが、その場合はコードのどこを変更したら良いでしょうか? これは、全作業完了後に1行目を挿入すれば良いでしょう ●セルのカラーを省いたい場合はコードのどこを削除したら良いでしょうか? カラーを省いたい場合とは挿入行に着色しないのですか?
補足
コメントありがとうございます。 挿入シートは最初から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)
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
補足
毎回ありがとうございます。 お陰様で動作できました。 質問ですが。 ●挿入シートのセル1行目は名称をつけておき、マクロ実行はセル2行目からにしたいのですが、その場合はコードのどこを変更したら良いでしょうか? ●セルのカラーを省いたい場合はコードのどこを削除したら良いでしょうか? 宜しくお願いします。
- watabe007
- ベストアンサー率62% (476/760)
さて、今回はどうでしょう 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行を入れたとしたらどこまで行が挿入されたか、分からなくなります。(やはり色が付いた方が分かると思いますが…) 最後に行を挿入した行の下に「ここまで」と記載した方が分かりやすいかと思いますが、コードの記述方法を教えて頂けたらと思います。 宜しくお願いします。
- ベストアンサー
- Visual Basic
- 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 宜しくお願いします。
- ベストアンサー
- Visual Basic
- 複数行に空白行を一括で挿入したいのですが
エクセルに関する質問です。 セル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 となってしまいました。 どうにか、求める結果を得られるようにできないでしょうか?
- ベストアンサー
- Visual Basic
- 数値を入力、ボタンをクリックして行を挿入
下記はA1に「5」を入力し、マクロを実行すると、A10行より5行分挿入するといったコードですが、シート1のA1に「5」を入力し、マクロを実行するとシート2のA10行より5行分挿入するといったコードを教えてくれませんか? 宜しくお願いします。 Sub Test() Range("A10").Resize(Range("A1").Value).EntireRow.Insert End Sub
- ベストアンサー
- Visual Basic
- 選択中の行に「行」を挿入するマクロ
エクセルのいちばん左(1から数字が縦に並んでいるところ)の任意の 数字を選択してその行を全選択しておいた状態でマクロを実行すると、そこに1行挿入するプログラムを教えてください。
- 締切済み
- Visual Basic
- エクセルで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」を入力。 以降に必要な処理はマクロで作成できたのですが、 その後に上記項目を手作業で処理しているのも限度があるので、 最初に挿入処理できればと思ってます。 分かりづらい説明だとは思いますが、 何卒ご教授頂きたくお願い致します。
- ベストアンサー
- その他MS Office製品
- 関数が含まれたセルの行をマクロで挿入する
セル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
- ベストアンサー
- その他(業務ソフトウェア)
お礼
おかげ様でうまくできました。 最後まで付き合ってくださりありがとうございました。