• ベストアンサー

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 よろしくお願いいたします。

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

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

シート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))) 下へコピィします。

noname#122225
質問者

お礼

関数の意味はまだ理解できていませんが、それでも目的のことができました。 どうもありがとうございました。

その他の回答 (3)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

>不要なIDの入っていた行が空白になって100行目まで表示されても との事なので シートCのA1に =IF(COUNTIF(シートB!$A$1:$A$2,シートA!A1),"",シートA!A1) オートフィルで100行目までコピー 不要な行が空白に成ります

noname#122225
質問者

お礼

なんとか目的の結果が得られることができました。 これからいろいろと機能を加えて行きたいと思います。 ありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#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

noname#122225
質問者

お礼

マクロを使うといろいろなことができる、という知識しかないので今回は関数で目的を果たさせていただきました。 これから勉強をしてマクロが使えるようになったら参考にさせていただきます。 ありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

関数の達人が回答をつけてくれると存じますが、マクロでやるなら、こんなコードで出来ます。普通と逆の方向から検索をかけているので、それなりに時間がかかります。データの範囲が一列でなくても処理できます。 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

関連するQ&A