エクセルの関数の質問です。2つのシートにAとBの列に100行分のデータが入力されています。重複しているデータを抽出して一方のシートから重複データを削除するにはどうしたらいいのでしょうか?

例えば、seat1に「A1に小沢」「B1に一郎」、「A2に管」「B2に直人」、「A3に野田」「B3に佳彦」・・・とあって、seat2に「A1に鳩山」「B1に由紀夫」、「A2に蓮」「B2に舫」、「A3に小沢」「B3に一郎」・・・とあった場合、2つのシートから重複している「小沢」「一郎」を抽出して、seat1の「A1の小沢」「B1の一郎」を削除する方法(関数)はありませんでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/12 21:55:03

ベストアンサー

id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

簡単なので過去回答参考にさせていただきました。

[追記]

書き忘れましたが、マクロで消すと元に戻せません。念のためファイルをバックアップするとかシートをコピーするとかして誤動作・誤操作に備えてください。

[/追記]

Option Explicit

'' 消す方のシートは現在表示しているアクティブシートの方です。
'' 比較対象のシートは"Sheet2"に固定されています。変更方法はコメントにあります。
'' 作業領域としてC桁に新しい桁を挿入して使い、使用後に削除しています。
'' 作業領域のボールドで強調されているのが重複した項目です。
'' 最後の方のコメントに従うと作業領域を消さずに残せます。
Private Sub CommandButton1_Click()
    Dim i As Long
    Dim lastRow As Long
    Dim res As Object
    
    Columns("C:C").Insert Shift:=xlToRight
    '' 比較対象のシートを変更するには下記の"Sheet2"を変更してください。
    With Worksheets("Sheet2")
        If ActiveSheet.Name = .Name Then
            Exit Sub
        End If
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For i = 1 To lastRow
            Cells(i, "C").Value = .Cells(i, "A").Value & .Cells(i, "B").Value
        Next i
    End With

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = lastRow To 1 Step -1
        Set res = Columns("C:C").Find(what:=Cells(i, "A").Value & Cells(i, "B").Value, _
            LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True, Matchbyte:=True)
        If Not res Is Nothing Then
            Cells(i, "A").Delete Shift:=xlShiftUp
            Cells(i, "B").Delete Shift:=xlShiftUp
            res.Font.Bold = True
        End If
    Next i
    '' 下記の行の先頭に「''」加えてコメントアウトすると作業領域が残ります。
    Columns("C:C").Delete Shift:=xlShiftToLeft
End Sub

消す方のシートは現在表示しているアクティブシートの方です。

比較対象のシートは"Sheet2"に固定されています。

比較対象のシートを変更するには下記の"Sheet2"を変更してください。

    With Worksheets("Sheet2")

作業領域としてC桁に新しい桁を挿入して使い、使用後に削除しています。

作業領域のボールドで強調されているのが重複した項目です。

最後の方のコメントに従うと作業領域を消さずに残せます。

下記の行の様に先頭に「''」加えてコメントアウトすると作業領域が残ります。

    ''Columns("C:C").Delete Shift:=xlShiftToLeft
id:yooshii

ありがとうございました。

返信が遅くなってすみません。

がんばってやってみます。

2011/10/17 20:20:47

その他の回答1件)

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

ワークシート関数だと削除というのはできないので、別のSheet3とかに抽出とかはできます。

ただ、関数で一応できることはできるのですが難しいのであまりやらないと思います。

例えば、Excel2007以降ならばcountifs関数と配列数式を使ってこんな感じ。

{=INDEX(Sheet1!A:A,SMALL(IF(COUNTIFS(Sheet2!A1:A100,Sheet1!A1:A100,Sheet2!B1:B100,Sheet1!B1:B100)>0,101,ROW(Sheet1!A1:A100)),ROW()))}

上記では100行くらいにしか対応していませんが、多くすると配列数式なので処理がかなり重くなるので現実的ではないです。

VBAの方法は簡単なので他の方にお任せします。

id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268ここでベストアンサー

簡単なので過去回答参考にさせていただきました。

[追記]

書き忘れましたが、マクロで消すと元に戻せません。念のためファイルをバックアップするとかシートをコピーするとかして誤動作・誤操作に備えてください。

[/追記]

Option Explicit

'' 消す方のシートは現在表示しているアクティブシートの方です。
'' 比較対象のシートは"Sheet2"に固定されています。変更方法はコメントにあります。
'' 作業領域としてC桁に新しい桁を挿入して使い、使用後に削除しています。
'' 作業領域のボールドで強調されているのが重複した項目です。
'' 最後の方のコメントに従うと作業領域を消さずに残せます。
Private Sub CommandButton1_Click()
    Dim i As Long
    Dim lastRow As Long
    Dim res As Object
    
    Columns("C:C").Insert Shift:=xlToRight
    '' 比較対象のシートを変更するには下記の"Sheet2"を変更してください。
    With Worksheets("Sheet2")
        If ActiveSheet.Name = .Name Then
            Exit Sub
        End If
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For i = 1 To lastRow
            Cells(i, "C").Value = .Cells(i, "A").Value & .Cells(i, "B").Value
        Next i
    End With

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = lastRow To 1 Step -1
        Set res = Columns("C:C").Find(what:=Cells(i, "A").Value & Cells(i, "B").Value, _
            LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True, Matchbyte:=True)
        If Not res Is Nothing Then
            Cells(i, "A").Delete Shift:=xlShiftUp
            Cells(i, "B").Delete Shift:=xlShiftUp
            res.Font.Bold = True
        End If
    Next i
    '' 下記の行の先頭に「''」加えてコメントアウトすると作業領域が残ります。
    Columns("C:C").Delete Shift:=xlShiftToLeft
End Sub

消す方のシートは現在表示しているアクティブシートの方です。

比較対象のシートは"Sheet2"に固定されています。

比較対象のシートを変更するには下記の"Sheet2"を変更してください。

    With Worksheets("Sheet2")

作業領域としてC桁に新しい桁を挿入して使い、使用後に削除しています。

作業領域のボールドで強調されているのが重複した項目です。

最後の方のコメントに従うと作業領域を消さずに残せます。

下記の行の様に先頭に「''」加えてコメントアウトすると作業領域が残ります。

    ''Columns("C:C").Delete Shift:=xlShiftToLeft
id:yooshii

ありがとうございました。

返信が遅くなってすみません。

がんばってやってみます。

2011/10/17 20:20:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません