• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロによる条件での行の入力と削除)

マクロによる行の入力と削除

このQ&Aのポイント
  • マクロを使用して、シート1とシート2の特定の行を追加および削除する方法について教えてください。
  • シート2にある特定の行を追加および削除するためのマクロの作成方法について教えてください。
  • 行の追加と削除を行うためのマクロを作成する方法を教えてください。

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

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

No.1・3・4です! 何度もごめんなさい。 ごく単純に・・・ 行削除のあとすぐに行挿入し、Sheet1のA100~A199 セルをSheet2にそのままコピー&ペーストだと間違いがないかもしれません。 Sub test3() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets(1) Set ws2 = Worksheets(2) Application.ScreenUpdating = False For j = 199 To 100 Step -1 For i = 100 To 199 If WorksheetFunction.CountIf(Range(ws1.Cells(100, 1), ws1.Cells(199, 1)), ws2.Cells(j, 1)) = 0 Then ws2.Rows(j).Delete ws2.Rows(j).Insert End If Next i Next j Application.ScreenUpdating = True Range(ws1.Cells(100, 1), ws1.Cells(199, 1)).Copy Destination:=ws2.Cells(100, 1) End Sub こんなんではどうでしょうか?m(_ _)m

kei__2000
質問者

お礼

 何度も修正回答いただきありがとうございます。こちらのやり方で、うまくできました。大変助かりました。お付き合いいただき、ありがとうございます。

その他の回答 (5)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.5

また後出しの「じつは…」あるとダメかもしれません。 Sub macro1()  On Error Resume Next  With Worksheets("Sheet1").Range("B100:D199")  .Formula = "=IF(VLOOKUP($A100,Sheet2!$A$100:$D$199,COLUMN(),FALSE)<>"""",VLOOKUP($A100,Sheet2!$A$100:$D$199,COLUMN(),FALSE),NA())"  .SpecialCells(xlCellTypeFormulas, xlErrors).ClearContents  .Value = .Value  Worksheets("Sheet1").Range("A100:D199").Copy Destination:=Worksheets("Sheet2").Range("A100")  .ClearContents  End With End Sub

kei__2000
質問者

お礼

 回答ありがとうございます。”後出し”は大変失礼しました。回答いただいたやり方でうまくできました。大変助かりました。

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

No.1・3です! たびたびごめんなさい。 投稿した後で気づいたのですが、コード内にCOUNTIF関数を使っていて、検索範囲が列全体になっています。 200行目以降に100~199行にあるデータと一致するものがある場合は希望通りの動きにならないと思います。 そこでもう一度コードを訂正したものを載せておきます。 Sub test2() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets(1) Set ws2 = Worksheets(2) Application.ScreenUpdating = False For j = 199 To 100 Step -1 For i = 100 To 199 If WorksheetFunction.CountIf(Range(ws1.Cells(100, 1), ws1.Cells(199, 1)), ws2.Cells(j, 1)) = 0 Then ws2.Rows(j).Delete End If If ws1.Cells(i, 1) < ws2.Cells(j, 1) And ws1.Cells(i, 1) > ws2.Cells(j - 1, 1) Then ws2.Rows(j).Insert ws2.Cells(j, 1) = ws1.Cells(i, 1) End If Next i Next j Application.ScreenUpdating = True End Sub ※ ちゃんと希望通りに動くことを期待しています。 何度も失礼しました。m(_ _)m

kei__2000
質問者

お礼

 回答ありがとうございます。こちらのやり方で範囲指定は満足できましたが、やはり行番200以降のデーターと、なぜだか頭の行番の通し番号、例では23が後尾についてしまうのは残念です。

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

No.1です! 補足を読ませてもらいました。 前回のコードは100行目~最終行まで!としていますので、希望通りにならなかったようですね! 前回のコードをそのまま利用する場合は2行だけの変更で大丈夫だと思います。 100~199行の間での操作だとすると、 各Sheetの最終行の部分を 199 に訂正すればOKかと思います。 >For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 100 Step -1 >For i = 100 To ws1.Cells(Rows.Count, 1).End(xlUp).Row の行を それぞれ >For j = 199 To 100 Step -1 >For i = 100 To 199 としてみてください。 これで何とか希望通りの動きにならないでしょうか?m(_ _)m

kei__2000
質問者

お礼

 補足の回答ありがとうございます。こちらのお願い通りに行範囲はできました。 ただ、この変更では追加分が後尾につき、行番200以降に入力されているデーターがこちらも後尾まで移動してしまうのが残念です。こちらのわがままに付き合っていただき、ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

こんなのはVBAでやる理由は無いのでは。手入力と、並べ替えと行削除操作で出来るのでは。 VBAでやらなければならない理由は? ーー 既出の回答のお礼を見ても、ただやって見て、結果が思い通りでした、を見るだけで、回答の処理のロジック(手順)の理解など出来てないのでは。少しぐらい変更できるレベルで無いと、質問して、回答をもらっても無駄では。 それで少し内容が追加・変更されると、追加質問になる。 例の挙げ方も不自然。左端の番号は行番号かデータなのか明示のこと。 何がしたいのかよくわからない。>行番102行が削除され、新たに通し番5番が行番100に、51番が行番108に挿入追加される、のは、どういう理由で102や5や51などが出てきたのか? ーー 削除で言えば Sub test06() x = InputBox("削除する番号") r = Range("a:a").Find(x).Row Rows(r).EntireRow.Delete End Sub という方法も在る。全行下から、削除する番号を探していく既回答とは別の方法。 追加は最下行の下行に追加データをVBAで入力し(しかしプログラムでデータ入力は、追加行が多数あれば、Inputboxやコードの中に書き込む方法とは別の他の方法を考える必要がある。)ソートすればよいのでは。 シート1とシート2は、そのデータ内容で追加や削除について、何か関連させるのかな。

kei__2000
質問者

お礼

 回答ありがとうございます。削除する番号を探していく方法は大変参考になりました。

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

こんにちは! 一例です。 データは両Sheet共、100行目からとしています。 標準モジュールにコピー&ペーストしてマクロを試してみてください。 Sub test() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets(1) Set ws2 = Worksheets(2) For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 100 Step -1 For i = 100 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(ws1.Columns(1), ws2.Cells(j, 1)) = 0 Then ws2.Rows(j).Delete End If If WorksheetFunction.CountIf(ws2.Columns(1), ws1.Cells(i, 1)) = 0 And _ ws1.Cells(i, 1) <> "" And ws1.Cells(i, 1) < ws2.Cells(j, 1) And _ ws1.Cells(i, 1) > ws2.Cells(j - 1, 1) Then ws2.Rows(j).Insert ws2.Cells(j, 1) = ws1.Cells(i, 1) End If Next i Next j End Sub こんな感じではどうでしょうか?m(__)m

kei__2000
質問者

お礼

 回答ありがとうございます。回答いただきました内容でうまくできました。しかしもしよろしければですが、こちらの説明不足で行番200から別のデーターが入力されているために、行番200番前まで、できればマクロ実行後に200番以降の行にデーターが入力されている行位置がマクロ実行前と同じ位置になっていればありがたいです。わがまま言って申し訳ありません。よろしくお願いします。

kei__2000
質問者

補足

 お礼の説明の、さらに補足です。シート1とシート2のどちらのシートにも行番200番以降から、別のデーターが入力されています。  大変失礼しました。解る方、よろしくお願いします。

関連するQ&A