プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

エクセルでデータを貼り付けしたときに、
A列とB列の完全一致データを行ごと(AからMまで)別のシートに摘出したいと思っております。
また一致したデータは削除せずに全て摘出したいと考えております。

膨大なデータ数ですので処理に時間はかかると思っておりますが、
VBAで自動で処理できる方法をご教示頂けないでしょうか。

ご指導を宜しくお願いいたします。

質問者からの補足コメント

  • 皆様、情報が足りず申し訳ございません。

    画像をつけました。
    実際にはA列からM列まで入力されておりまして、
    膨大といいましても2万行くらいかと思っております。

    見出し行について画像に入っておりませんが、
    実際は見出し行が入っております。

    「エクセル 2つの列にある値の完全一致を抜」の補足画像1
      補足日時:2022/12/15 14:33
  • 実際のデータは別のエクセルデータになるのですが、
    シート1にペーストした時に、シート2に摘出されるようにしたいと
    思っております。

      補足日時:2022/12/15 14:38
  • 貼り付ける前は別のエクセルデータになりますので、
    自分でコピーしてきて貼り付けることを想定しております。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/12/15 14:42
  • うーん・・・

    Qchan1962さんのVBAをsheet1に入れまして、コピー元からペーストしてみると何も起こりませんので、実行を押してみた所、新規ブックが立ち上がったのですが、エラーが出まして、「ActiveX コンポーネントはオブジェクトを作成できません。」と出てしまいました。理由がわからないのですが、
    エクセルのバージョンなど関係あるのでしょうか。

    当方、Macでエクセルバージョンは16.16.27となります。

    ご指導よろしくお願いいたします。

    No.8の回答に寄せられた補足コメントです。 補足日時:2022/12/15 20:58

A 回答 (15件中1~10件)

No11,12です。


下記URLにマクロをアップしました。
こちらからマクロを入手してください。
https://ideone.com/14Kmqj
    • good
    • 0
この回答へのお礼

お返事が遅れてしまい申し訳ございません。
改良有難うございます!

実行したところ、
希望通りの結果になり大変感激しております。

皆様にベストアンサーをつけたいのですが、
最終的な観点からtatsumaru77様に致しました。

最後までお付き合い頂きまして、
大変感謝しております。

有難うございました!

お礼日時:2022/12/17 09:32

No14様


ご指摘、ありがとうございました。
Order1 はOrder2の誤りでした。
A列とB列が共に等しいものを抽出するので、ソートの対象となります。

質問者様へ
下記URLに修正版をアップしました。
https://ideone.com/VCavZE
No13でアップしたマクロは破棄してください。
    • good
    • 0

A列でって事なので、



key2:=sh3.Range("B1"), Order1:=xlAscending,

B列についてはいらないのでは?
名前付き引数:Order1 が key1 と同じなのも気にはなるけど。
初心者レベルなので見てみただけの感じであり無知ではありますが。
    • good
    • 0
この回答へのお礼

ご指導有難うございます!

お礼日時:2022/12/17 09:34

No11です。


>データをペーストしてみたのですが、
>何も変わらず、摘出が行われていない状態でしたので、
>マクロの実行を行ったところ、

はい。ペーストした後に、登録したマクロ「重複データ抽出」を実行します。

>コンパイル エラーです。:
>名前付き引数は、すでに指定されています。

コピペに誤りがあったとしか、考えられません。

Option Explicit
Public Sub 重複データ抽出()

End Sub

の範囲を正しくコピペしているか、確認してください。

又、
sh3.Range("A1:M" & maxrow1 - 1).Sort key1:=sh3.Range("A1"), Order1:=xlAscending, key2:=sh3.Range("B1"), Order1:=xlAscending, Header:=xlNo
は、1行の文です。1行に収まっているか確認してください。
    • good
    • 0

Macがないので、Macで検証していません。


Sheet1から重複データを抽出し、Sheet2に格納します。
作業用のシートとして、シート名:作業用
を使用します。作業用シートを作成しておいてください。
Scripting.dictionaryを使用しないので、たぶん動作すると思います。
実行時間は当方の環境で、2万件で約4秒でした。
標準モジュールに登録してください。

Option Explicit
Public Sub 重複データ抽出()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim maxrow1 As Long
Dim row3 As Long
Dim row31 As Long
Dim row2 As Long
Dim key As String
Dim old_key As String
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Set sh3 = Worksheets("作業用")
sh2.Cells.ClearContents
sh3.Cells.ClearContents
maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row
sh2.Cells(1, 1).Resize(1, 13).Value = sh1.Cells(1, 1).Resize(1, 13).Value
sh3.Cells(1, 1).Resize(maxrow1 - 1, 13) = sh1.Cells(2, 1).Resize(maxrow1 - 1, 13).Value
sh3.Range("A1:M" & maxrow1 - 1).Sort key1:=sh3.Range("A1"), Order1:=xlAscending, key2:=sh3.Range("B1"), Order1:=xlAscending, Header:=xlNo
old_key = ""
row2 = 2
For row3 = 1 To maxrow1 - 1
key = sh3.Cells(row3, 1).Value & "|" & sh3.Cells(row3, 2).Value
If key = old_key Then
If row31 <> 0 Then
sh2.Cells(row2, 1).Resize(1, 13).Value = sh3.Cells(row31, 1).Resize(1, 13).Value
row31 = 0
row2 = row2 + 1
End If
sh2.Cells(row2, 1).Resize(1, 13).Value = sh3.Cells(row3, 1).Resize(1, 13).Value
row2 = row2 + 1
Else
row31 = row3
End If
old_key = key
Next
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

有難うございます。

Sheet1、Sheet2、作業用の3つを作成して
照準モジュールにご指導頂いた文を追加後に、
データをペーストしてみたのですが、
何も変わらず、摘出が行われていない状態でしたので、
マクロの実行を行ったところ、
ーーー
コンパイル エラーです。:
名前付き引数は、すでに指定されています。
ーーー
と出まして、Public Sub 重複データ抽出()という箇所が
黄色くなっておりました。

かなりの素人で申し訳ないのですが、
今一度、実行するまでに何か悪かったのか教えていただけますでしょうか?

お礼日時:2022/12/16 15:28

一応


処理時間は分かりません・・未検証

Sub Example02()
Application.ScreenUpdating = False
ActiveSheet.Copy
Dim arData As Variant
Dim i As Long
Dim v()
Dim Rng As Range
arData = Range(Cells(1, "A"), Cells(Rows.Count, "M").End(xlUp)).Value
ReDim v(1 To UBound(arData))
For i = 1 To UBound(arData)
v(i) = arData(i, 1) & arData(i, 2)
Next
Cells(1, "N").Resize(UBound(v)) = WorksheetFunction.Transpose(v)
For i = 1 To UBound(v)
If Application.CountIf(Range(Cells(1, "N"), Cells(Rows.Count, "N").End(xlUp)), v(i)) <= 1 Then
If Rng Is Nothing Then
Set Rng = Cells(i, 1)
Else
Set Rng = Union(Rng, Cells(i, 1))
End If
End If
Next
Rng.EntireRow.Delete
Columns("N:N").Delete
Range("A1").CurrentRegion.Sort Key1:=Range("A1"), Order1:=xlAscending
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

有難うございます。

マクロに追加して実行してみたところ、
ペーストしたデータのまま摘出されている感じで、
新規ブックが立ち上がるのみとなっております。

みなさまの環境では、
稼働している状態なのに、
何が悪いのか全く見当がつきません。

工程のどこか悪いか検討つきますでしょうか?

お礼日時:2022/12/16 15:31

#8です


Macエクセルですか・・・
残念です
CreateObject("Scripting.dictionary")が使えません
StrCompも使えるか分かりません
一応、 https://qiita.com/r_keir/items/6f03a753bbd32dc8c …
で対策し添削する必要があるようです

ローカル環境にMacエクセルが無い為、代替え手法が上手くいくか、
処理速度などの確認も出来ない為、これ以上の回答は出来そうもありません
    • good
    • 0

こんばんは


出力の位置関係はどうします?ソートしますか(元データ順)・・
それとも2つ目が出てきた順で良いですか・・
ソートする 例見出しは考慮していません 新規ブックで操作されます
処理速度はデモデータが無いので未確認

Sub Example01()
ActiveSheet.Copy
Dim dic As Object
Set dic = CreateObject("Scripting.dictionary")
Dim arData As Variant
Dim ary()
Dim i As Long, j As Long
Dim v As String
Dim Rng As Range
arData = Range(Cells(1, "A"), Cells(Rows.Count, "M").End(xlUp)).Value
For i = 1 To UBound(arData)
v = arData(i, 1) & arData(i, 2)
If Not dic.Exists(v) Then
dic.Add v, 0
Else
If dic.Item(v) = 0 Then
ReDim Preserve ary(j)
ary(j) = v
j = j + 1
End If
dic.Item(v) = dic.Item(v) + 1
End If
Next
Set dic = Nothing
Dim k, dupData()
Dim n As Long, x As Long
For j = 0 To UBound(ary)
For i = 1 To UBound(arData)
v = arData(i, 1) & arData(i, 2)
If StrComp(v, ary(j)) = 0 Then
For x = 1 To UBound(arData, 2)
ReDim Preserve dupData(UBound(arData, 2), n)
dupData(0, n) = i
dupData(x, n) = arData(i, x)
Next
n = n + 1
End If
Next i
Next
Range("A1").CurrentRegion.ClearContents
Range("A1").Resize(UBound(dupData, 2) + 1, UBound(dupData, 1) + 1).Value = WorksheetFunction.Transpose(dupData)
Range("A1").CurrentRegion.Sort Key1:=Range("A1"), Order1:=xlAscending
Columns(1).Delete
End Sub
この回答への補足あり
    • good
    • 1
この回答へのお礼

有難うございます!
摘出後にA列を基準にソートができれば尚よいと考えております。

これから試してみようと思います!

お礼日時:2022/12/15 19:47

補足要求です。


①見出しは1行目で、データは2行目からでしょうか。
②シート1のシート名は何でしょうか。(Sheet1で良いですか)
③シート2のシート名は何でしょうか。(Sheet2で良いですか)
    • good
    • 0
この回答へのお礼

有難うございます。

見出しは1行目で、データは2行目からになります。
シート名はSheet1とShee2でよいと考えております。

お礼日時:2022/12/15 19:42

No5です。



10000行でテストしたけれど、1秒もかからないですよ。
(マシンの性能も影響すると思いますが・・・)
    • good
    • 0
この回答へのお礼

有難うございます。これからご指示の通りに試してみようと思います。

お礼日時:2022/12/15 19:43

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