プロが教えるわが家の防犯対策術!

エクセルである文字列を含むセルを持つ行を削除したいです。

例えば、

Sheet1に5列(AからE)×5行のデータがあり
その中のA、B、Dの列から
Sheet2のA列にリスト化した文字列"a""b""c""d""e"という文字列を含む行を探し出し、
その行だけを削除する

といったことがしたいです。

Sheet2のリストは随時増えていくので拡張性のある方法を教えてください。
よろしくお願いします。

A 回答 (3件)

以下のマクロを標準モジュールに登録し、実行してください。


削除対象の行があると、メッセージボックスに表示し、削除します。
------------------------------------------------
Option Explicit

Dim Sh1, sh2 As Worksheet
Dim MaxRow As Long ' Sheet2の最終行

Public Sub Macro()
Dim row1 As Long 'sheet1の行番号
Dim row2 As Long 'sheet2の行番号
Dim row As Long '行番号(sheet2一時作業用)
Dim delf As Boolean
Set Sh1 = Worksheets("sheet1") '
Set sh2 = Worksheets("sheet2") ' 削除リスト
MaxRow = sh2.Cells(Rows.Count, 1).End(xlUp).row ' 最終行を求める
'sheet1を5行->1行に順に検索
For row1 = 5 To 1 Step -1
delf = True '削除する
If CheckDuplicate(Sh1.Cells(row1, 1)) = False Then
If CheckDuplicate(Sh1.Cells(row1, 2)) = False Then
If CheckDuplicate(Sh1.Cells(row1, 4)) = False Then
delf = False '削除しない
End If
End If
End If
If delf = True Then
MsgBox (row1 & "行を削除します")
Sh1.Rows(row1).Delete
End If
Next
End Sub

'重複チェック
Public Function CheckDuplicate(ByVal str As String)
CheckDuplicate = False '重複なし
Dim row As Long
For row = 1 To MaxRow
'str中(sheet1のA,B,D列の何れかの値)にsheet2のA列の文字が含まれるなら
If InStr(str, sh2.Cells(row, 1).Value) <> 0 Then
CheckDuplicate = True '重複あり
Exit Function
End If
Next
End Function

------------------------------------------------
    • good
    • 0
この回答へのお礼

すごい!一発でできました!
これでかなりの時間短縮&正確さになります。
ありがとうございます。

お礼日時:2016/10/18 12:27

補足要求です。


>Sheet2のA列にリスト化した文字列"a""b""c""d""e"という文字列を含む行を探し出し、
>その行だけを削除する
質問1:Sheet2のA列にリスト化した文字列"a""b""c""d""e" とは、
A1="a"
A2="b"
A3="c"
A4="d"
A5="e"
のように格納されているということですか?

質問2:Sheet2のA列にリスト化した文字列"a""b""c""d""e"という文字列を含む行を探し出し とは
sheet1 の A1の内容が"e"のとき(完全一致)は、削除対象ですが、
A1の内容が"XXXeYYY"のように、"e"を含んでいる場合(部分一致)でも、削除対象でしょうか?

質問3:1行、削除すると、下の行が繰り上がってきますが、それで良いですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
質問1、その通りです。
質問2、部分一致でも削除対象です。
質問3、繰り上げたいです。
よろしくお願いします。

お礼日時:2016/10/18 06:23

Sheet1のA1~E5の5x5のデータがあり、Sheet2のA列にリスト化した削除用文字列があるとして回答します。



ここでは、Sheet1のF~K列を作業列とします。(実際には空白列でよいです)
1. F1セルに、『=AND(ISERROR(FIND(OFFSET(Sheet2!$A$1,COLUMN()-COLUMN($F$1),0,1,1),$A9)),ISERROR(FIND(OFFSET(Sheet2!$A$1,COLUMN()-COLUMN($F$1),0,1,1),$B9)),ISERROR(FIND(OFFSET(Sheet2!$A$1,COLUMN()-COLUMN($F$1),0,1,1),$D9)))』と入力します。
2. F1セルをコピーして、F1~J5セルに貼りつけます。
3. K1セルに『=IF(AND(F9:K9),"OK","DELETE")』と入力します。
4. K1セルをコピーして、K1~K5セルに貼りつけます。
5. フィルタを掛けて、K列にDELETEと表示された行のみ表示させます。
6. 選択して行削除すればよいです。
※カギカッコ『』は入力する必要ありません。

作業列の位置を変える場合は、式のセル位置を修正する必要があるかもしれません。
Sheet2のリストが増えた場合は、増えたリストの数に応じて、作業列の2列目をコピーして『コピーした列の挿入』をすればよいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
おっしゃられたとおり入力してみましたが、1に関してはすべてTRUEが、3に関してはエラーが返されます。
1のA9,B9,D9、3のF9:K9というのがよくわからないのですが、A1,B1,D1、F1:K1ですかね?

お礼日時:2016/10/18 06:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A