• ベストアンサー

EXCELを使ってデータ抽出の方法

二つのシートから、品番の違うものを抽出したいのです。たとえば: シート1に 品番 A-654565-005-2 B-789456-003-4 C-258369-001-3 E-357689-009-9 D-147258-004-4 d-147258-005-5 usp-3690258-006-8 usp-3690258-006-8 シート2に 品番 A-654565-005-2 B-789456-003-4 C-258369-001-3 d-147258-005-5 があります。シート1とシート2と比べると、「usp-3690258-006-8」のような品番がないのです。そのようなもの(シート2にないもの)を全部シート3に抽出したいのです。やり方を教えてください。よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#4です。 ●私の場合Sheet2の品番について、Sheet1の品番テーブルに無いもの(Sheet1を主体にしてSheet2をチェックした)を、Sheet3に書き出すようにしました。質問のSheet1の例示の数が、Sheet2の例示の数より多かったものでつい思いこみました。質問では逆でした。 関数式Sheet1!とSheet2!を相互に入れ替えてみてください。 ●それに品番だけのテーブルはおかしいと思い、、FALSEの前を2にしましたが、1(検索列自身。品番列)に改めてみてください。 今のところそれ以外は誤りが発見できません。

teiken
質問者

お礼

大変ありがとうございました。VLOOKUPを使いましたが、なぜかうまくいきませんでした。でも、IFとISERRORを使いました。いいヒントを与えてくれてありがとうございます。 私は二列を使って =ISERROR(MATCH(Sheet2!A7,Sheet1!$A:$A,0)) と=IF(A1=TRUE,Sheet2!A7,"")という式を使いました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

Sheet1の品番がユニーク(重複なし)なら、 シート3のA1に =IF(ISERROR(VLOOKUP(Sheet2!A1,Sheet1!$A$1:$B$4,2,FALSE)),Sheet2!A1,"")といれ、下に複写してださい。 B1には =IF(ISERROR(VLOOKUP(Sheet2!A1,Sheet1!$A$1:$B$4,2,FALSE)),Sheet2!B1,"") といれ、C1、D1・・列以右も同様です。 Sheet1の品番をテーブル(表)としてSheet2のA列品番1つ1つを探し、見つからない時は、その行のA,B、C・・のセルの値をSheet3に持ってきます。 後はSheet3で値のみの複写を自己自身に行い 式を消し、ソートすればデータは下に沈殿しますので、上部のスペース部分を削除してください。 テスト不足ですが、上手く行くといいですが。 実のところVBAでやりたい!

teiken
質問者

お礼

ありがとうございます。 教えていただいた方法で試しましたが、なぜかうまくいきませんでした。よければもう一度詳しく教えていただけないのでしょうか。よろしくお願いします。

  • fever
  • ベストアンサー率43% (32/73)
回答No.3

Sheet1の方に関数:MATCHを用いる手もあります。 Sheet1のB2に =MATCH(A2,Sheet2!$A:$A,0) と入力し、あとはフィルハンドルでリストの最後までコピーします。 Sheet2にない品番には『#N/A』が表示されますので、オートフィルタで『#N/A』のみを表示させます。 A列をコピーして、Sheet3にペーストします。

teiken
質問者

補足

教えていただいたとおり、シート2にない品番が『#N/A』と表示しました。しかし、『#N/A』と表示した品番はどうやってシート3に抽出するのですか。教えてください。ありがとうございます。

noname#4564
noname#4564
回答No.2

  この手の処理はデータベースを使うに限ります。 下記の要領で行けると思いますが、どうでしょう。 # Jetでは文字列の比較がTextCompareなので、大文字小文字の区別が問題ですが・・・。 Public Sub PickUp() Dim Engine As Object Dim db As Object Dim rs As Object Dim strSql As String Dim FullDbName As String Set Engine = CreateObject("DAO.DBEngine.36") With Application.ActiveWorkbook Set db = Engine.OpenDatabase(.Path & "\" & .Name, False, False, "Excel 8.0") End With FullDbName = "[Excel 8.0;Database=" & db.Name & "]" strSql = "SELECT DISTINCT Table1.品番" strSql = strSql & " FROM" strSql = strSql & " " & FullDbName & ".[Sheet1$] Table1" strSql = strSql & " LEFT JOIN" strSql = strSql & " " & FullDbName & ".[Sheet2$] Table2" strSql = strSql & " ON" strSql = strSql & " Table1.品番 = Table2.品番" strSql = strSql & " WHERE" strSql = strSql & " Table2.品番" strSql = strSql & " Is Null" strSql = strSql & " ORDER BY Table1.品番" Set rs = db.OpenRecordset(strSql, 4) 'dbOpenSnapshot Application.Worksheets("Sheet3").Cells(1, 1).CopyFromRecordset rs db.Close Set rs = Nothing Set db = Nothing End Sub  

teiken
質問者

お礼

答えていただき、ありがとうございます。

  • kojitti
  • ベストアンサー率32% (449/1386)
回答No.1

これでどうでしょうか? Sub Main() k = 1 For i = 1 To 65536 If Worksheets(1).Range("A1")(i) = "" Then Exit For For j = 1 To 65536 If Worksheets(2).Range("A1")(j) = Worksheets(1).Range("A1")(i) Then Exit For If Worksheets(2).Range("A1")(j) = "" Or j = 65536 Then Worksheets(3).Range("A1")(k).Formula = Worksheets(1).Range("A1")(i) k = k + 1 Exit For End If Next j Next i End Sub

teiken
質問者

お礼

早速答えていただき、本当にありがとうございます。 プロではないので、なかなかむずかしいと思います。

関連するQ&A