こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAの質問です。

エクセル2010を使用しています。

Excel VBA で二つのシートを比較して合致するレコードの行を削除する方法

値下げ,まとめのシートがありまして、

値下げ:b列に商品コードのデータ
まとめ:a列に商品コードのデータ

のようなExcelのデータがあります。

ここから、値下げのシートの商品コードを一つ一つ読み込みながら、まとめの商品コードと比較して、合致した値下げの商品コードの行を削除するプログラムを作りたいです。
商品コードのデータ数は毎回違い、値下げとまとめでも商品コードのデータ数は違います。

どなたかご教示いただけないでしょうか?
よろしくお願いいたします。

投稿日時 - 2014-11-26 01:40:29

QNo.8837576

すぐに回答ほしいです

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

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

投稿日時 - 2014-11-26 23:08:17

お礼

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

投稿日時 - 2014-11-27 07:51:15

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2014-11-26 20:17:00

補足

ありがとうございます!!できました!!

参考にですが、データが一行目からある場合はどこを変更すればよろしいのでしょうか?

すいません。
超初心者な質問で・・・。

まだまだ全く理解ができていないので、次回から作るときの参考にさせていただければと思いまして・・・。

投稿日時 - 2014-11-26 22:32:45

ANo.1

質問です。

まず、データの入っている行に
抜け(空白行)はありますか?

それとも、必ず両方(「値下げ」「まとめ」)とも
データのある行は連続していますか?

これは、最終行を取得するために必要な質問です。

次に、削除するのは、どちらのシートですか?

両方のシートとも、削除するのですか?

また、削除したあと、
行詰めを行うのですか?

それとも、削除したあと、
そのままにしておいて良いのですか?

投稿日時 - 2014-11-26 17:45:16

補足

説明が足りなく、申し訳ありませんでした。

データの入っている行に空白はありません。
データのある行の連続になっています。

削除するのは「値下げ」のシートのほうだけになります。

削除したあと、行詰めを行います。

申し訳ありません、よろしくお願いします。

投稿日時 - 2014-11-26 19:26:18

あなたにオススメの質問