• ベストアンサー

Excel VBAの質問です。

エクセル2010を使用しています。 Excel VBA で二つのシートを比較して合致するレコードの行を削除する方法 値下げ,まとめのシートがありまして、 値下げ:b列に商品コードのデータ まとめ:a列に商品コードのデータ のようなExcelのデータがあります。 ここから、値下げのシートの商品コードを一つ一つ読み込みながら、まとめの商品コードと比較して、合致した値下げの商品コードの行を削除するプログラムを作りたいです。 商品コードのデータ数は毎回違い、値下げとまとめでも商品コードのデータ数は違います。 どなたかご教示いただけないでしょうか? よろしくお願いいたします。

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

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

No.2です。 補足の >データが一行目からある場合はどこを変更すればよろしいのでしょうか? について・・・ 前回のコードはループさせずにフィルタを使って該当データが複数ある場合は その行を一気に削除しています。 フィルタを掛けるためには「項目行」的な行が1行必要ですので、 データが1行目からある場合は「項目行」用として1行目を挿入してみました。 (若干の説明もコード内に載せておきます。★印の部分が変更または追加した部分です) Sub 行削除2() Dim i As Long, lastRow As Long, wS As Worksheet Set wS = Worksheets("まとめ") Application.ScreenUpdating = False With Worksheets("値下げ") '▼「値下げ」Sheetの1行目を挿入 .Rows(1).Insert '←フィルタを掛けるための項目行代わり★ .Range("A1") = "ダミー" '←不要かも・・・★ '▼「値下げ」SheetのB列最終行を取得 lastRow = .Cells(Rows.Count, "B").End(xlUp).Row '▼「まとめ」Sheetの1行目~A列最終行まで For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row '←「2」を「1」に変更★ '▼「値下げ」SheetのB列でフィルタを掛ける(抽出条件は「まとめ」SheetのA列 i 行目) .Rows(1).AutoFilter field:=2, Criteria1:=wS.Cells(i, "A") '▼「まとめ」Sheetの表示されている行が2行目以降にあれば・・・ If .Cells(Rows.Count, "B").End(xlUp).Row > 1 Then '▼A2~A列最終行までの表示されている行を削除し、上詰め Range(.Cells(2, "A"), .Cells(lastRow, "A")).EntireRow.SpecialCells(xlCellTypeVisible).Delete shift:=xlUp End If '▼「まとめ」Sheetの次の行へ Next i '▼オートフィルタモードを解除 .AutoFilterMode = False '▼挿入した行を削除 .Rows(1).Delete '★ End With Application.ScreenUpdating = True End Sub ※ 今回は両Sheetとも1行目からデータがあるという前提です。m(_ _)m

kuromamedaifuku
質問者

お礼

物凄く勉強になります!! ありがとうございました!!

すると、全ての回答が全文表示されます。

その他の回答 (2)

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

こんばんは! 横からお邪魔します。 両Sheetとも1行目は項目行でデータは2行目以降にあるとします。 ↓のコードを標準モジュールにコピー&ペーストしてマクロを実行してみてください。 Sub 行削除() Dim i As Long, lastRow As Long, wS As Worksheet Set wS = Worksheets("まとめ") Application.ScreenUpdating = False With Worksheets("値下げ") lastRow = .Cells(Rows.Count, "B").End(xlUp).Row For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row .Rows(1).AutoFilter field:=2, Criteria1:=wS.Cells(i, "A") If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then Range(.Cells(2, "A"), .Cells(lastRow, "A")).EntireRow _ .SpecialCells(xlCellTypeVisible).Delete shift:=xlUp End If Next i .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m

kuromamedaifuku
質問者

補足

ありがとうございます!!できました!! 参考にですが、データが一行目からある場合はどこを変更すればよろしいのでしょうか? すいません。 超初心者な質問で・・・。 まだまだ全く理解ができていないので、次回から作るときの参考にさせていただければと思いまして・・・。

すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

質問です。 まず、データの入っている行に 抜け(空白行)はありますか? それとも、必ず両方(「値下げ」「まとめ」)とも データのある行は連続していますか? これは、最終行を取得するために必要な質問です。 次に、削除するのは、どちらのシートですか? 両方のシートとも、削除するのですか? また、削除したあと、 行詰めを行うのですか? それとも、削除したあと、 そのままにしておいて良いのですか?

kuromamedaifuku
質問者

補足

説明が足りなく、申し訳ありませんでした。 データの入っている行に空白はありません。 データのある行の連続になっています。 削除するのは「値下げ」のシートのほうだけになります。 削除したあと、行詰めを行います。 申し訳ありません、よろしくお願いします。

すると、全ての回答が全文表示されます。

専門家に質問してみよう