- ベストアンサー
Excelでの抽出(検索?)
エクセルを使い、シートAにID(100件)を、シートBに不要なID(10件)が入っています。 このとき、シートCにA-Bの90件のIDを表示させたいのですが、どのような方法があるでしょうか。 シートCは、シートAで不要なIDの入っていた行が空白になって100行目まで表示されても、詰まって90行まで(空白がなく必要なIDのみ)が表示されてもどちらもでかまいません。 例えばこんな感じです。 シートA シートB シートC A12 B34 A12 B34 D78 C56 C56 E90 D78 E90 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
シートAに作業列入れますがよろしいでしょうか。 シートA シートB シートC A12 1 B34 A12 B34 D78 C56 C56 3 E90 D78 E90 5 シートAのB列に =IF(COUNTIF(シートB!A:A,Sheet1!A2),"",ROW()) 下へコピィ シートBにないIDにのみ行番号を表示 シートCに =INDEX(シートA!A:A,SMALL(シートA!B:B,ROW(A1))) 下へコピィ エラー処理加えると =IF(ISERROR(SMALL(シートA!B:B,ROW(A1))),"",INDEX(シートA!A:A,SMALL(シートA!B:B,ROW(A1))) 下へコピィします。
その他の回答 (3)
- hige_082
- ベストアンサー率50% (379/747)
>不要なIDの入っていた行が空白になって100行目まで表示されても との事なので シートCのA1に =IF(COUNTIF(シートB!$A$1:$A$2,シートA!A1),"",シートA!A1) オートフィルで100行目までコピー 不要な行が空白に成ります
お礼
なんとか目的の結果が得られることができました。 これからいろいろと機能を加えて行きたいと思います。 ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
#2です。重複が無ければ下記のコードの方が速いです。期待されていないと思いますが、話の種に載せておきます。 Sub test() Dim targetRange As Range, refRange As Range, myCell As Range Dim destRange As Range, retRange As Range, tempRange As Range Set targetRange = Sheets("Sheet1").Range("a1:a100") Set refRange = Sheets("Sheet2").Range("a1:a10") Set destRange = Sheets("Sheet3").Range("a1") For Each myCell In refRange.Cells Set retRange = targetRange.Find(myCell.Value, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, MatchByte:=False) If Not retRange Is Nothing Then If tempRange Is Nothing Then Set tempRange = retRange Else Set tempRange = Union(tempRange, retRange) End If End If Next myCell For Each myCell In targetRange.Cells If Intersect(myCell, tempRange) Is Nothing Then destRange.Value = myCell.Value Set destRange = destRange.Offset(1, 0) End If Next End Sub
お礼
マクロを使うといろいろなことができる、という知識しかないので今回は関数で目的を果たさせていただきました。 これから勉強をしてマクロが使えるようになったら参考にさせていただきます。 ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
関数の達人が回答をつけてくれると存じますが、マクロでやるなら、こんなコードで出来ます。普通と逆の方向から検索をかけているので、それなりに時間がかかります。データの範囲が一列でなくても処理できます。 Sub test() Dim targetRange As Range, refRange As Range, myCell As Range Dim destRange As Range, retRange As Range Set targetRange = Sheets("Sheet1").Range("a1:a100") Set refRange = Sheets("Sheet2").Range("a1:a10") Set destRange = Sheets("Sheet3").Range("a1") For Each myCell In targetRange.Cells Set retRange = refRange.Find(myCell.Value, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, MatchByte:=False) If retRange Is Nothing Then destRange.Value = myCell.Value Set destRange = destRange.Offset(1, 0) End If Next myCell End Sub
お礼
関数の意味はまだ理解できていませんが、それでも目的のことができました。 どうもありがとうございました。