ホテルを選ぶとき、これだけは譲れない条件TOP3は?

重複データを抽出したく試していますが、以下で詰まっています。

例えば、
A、B、C列のデータを連結したものを比較対象とし、
複数行あるものから重複データを抽出したいのですが、
「&」で繋げたものを比較すると、違うものとみなされます。

A1、B1、C1を連結したものを111(A1に1、B1に1、C1に1)とし、
A2、B2、C2を連結したものを111(A2に1、B2に1、C2に1)とした場合、

dictionaryを使って、重複データを抽出している途中ですが、
「111」と「111」が違うものとして判断されてしまいますが、
同じだからエラー(既に割り当てられてる)で止まります(結合しなければ、機能します)。
一旦シート上で結合したものを値貼り付けに変えて、それをチェック対象にするしかないでしょうか?
データは数万行あります。

ご存知の方、ご教示お願いします。

<以下コード(コードは自分で考えたものではなく一部流用で、抽出できたら整形します)>

Sub test()

Dim i As Long
Dim j As Long
Dim maxRow As Long
Dim dic As Object
Dim strMat, lngNum

Set dic = CreateObject("scripting.dictionary")

j = 2 'リスト書き出し開始行

With ActiveSheet

maxRow = .Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To maxRow
strMat = .Cells(i, 2).Value & .Cells(i, 3).Value & .Cells(i, 4).Value←ここ
If dic.Exists(strMat) Then
' 重複してる
.Cells(dic.Item(strMat), 7).Value = strMat
Else
' 重複してない
dic.Add (.Cells(i, 2).Value), j
j = j + 1
End If
Next i

End With

end sub

A 回答 (4件)

strMat = .Cells(i, 2).Value & .Cells(i, 3).Value & .Cells(i, 4).Value


とおいて、この3つのセルを連結した文字列strMatがdicに存在しているかどうかのチェックをしています。

一方で、重複していないときは
dic.Add (.Cells(i, 2).Value), j
で .Cells(i, 2).Value だけキーとして追加されます。
これがおかしいのでは?


A1、B1、C1を連結したものを111(A1に1、B1に1、C1に1)とし、
A2、B2、C2を連結したものを111(A2に1、B2に1、C2に1)とした場合、
で動きを考えると
1ループ目:
dicに「111」は含まれない → dicにA1の「1」が追加される
2ループ目:
dicに「111」は「含まれない」 → dicにA2の「1」を追加しようとするが既に1が登録されている

となるはずです
    • good
    • 0
この回答へのお礼

早々のアドバイスありがとうございます。
流用の変更漏れでした。
解決しました。

お礼日時:2024/10/08 22:42

提示されたマクロを少し変えました。


2行目以降に、以下の項目を出力します。
①G列へ重複している組み合わせ
②H列へ組み合わせの件数

Sub test2()

Dim i As Long
Dim j As Long
Dim maxRow As Long
Dim dic As Object
Dim strMat, lngNum
Dim key As Variant
Set dic = CreateObject("scripting.dictionary")

j = 2 'リスト書き出し開始行

With ActiveSheet

maxRow = .Cells(Rows.Count, 2).End(xlUp).row
For i = 2 To maxRow
strMat = .Cells(i, 2).Value & .Cells(i, 3).Value & .Cells(i, 4).Value
If dic.Exists(strMat) Then
' 重複してる
dic.Item(strMat) = dic.Item(strMat) + 1
Else
' 重複してない
dic.Add strMat, 1
End If
Next i

For Each key In dic.keys
If dic.Item(key) > 1 Then
.Cells(j, "G").Value = key
.Cells(j, "H").Value = dic.Item(key)
j = j + 1
End If
Next

End With

End Sub
    • good
    • 0
この回答へのお礼

出力コード、助かります。
参考にさせていただきます。

お礼日時:2024/10/09 13:42

こんばんは



基本的には「keyが同じか否か」で判断しているはずです。

>「111」と「111」が違うものとして判断されてしまいますが、~
該当箇所の内容をピックアップして、実際にどうなっているかを確認してみてください。
多分、違うものになっているはずと思います。
例えば、セル値のみかけは同じでも、後ろにスペースが入っているとか、あるいは少数以下がある値を表示上は整数にして表示している場合などの可能性が考えられます。

一方で、ご提示のコードでは、キーの追加に
(タイポかも知れませんけれど・・)
 >dic.Add (.Cells(i, 2).Value), j
として、チェックとは関係のないキーを追加していますけれど??
 >dic.Add (strMat), j
なのではないでしょうか?
(もしも、ご提示のままならチェックできないのは当然の結果と言えます)


なお、ご質問には関係ありませんけれど・・
ご提示のように単純に連結する方法だと、
 A1、B1、C1が順に「11」、「2」、「3」で
 A2、B2、C2が順に「1」、「12」、「3」や
 「11」、「(空白)」、「23」 となっている場合に
同じものと判断されますが、それはそれで良いということでしょうか?
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
後半のご質問について、現状、個別のセル値は一応パターンが決まっているの個別セルだと重複が機能しないため、結合値が1つのデータという状況です。

お礼日時:2024/10/09 08:30

' 重複してない


dic.Add (.Cells(i, 2).Value), j

上記の内容を
dic.Add strMat, j

に変えてください。
それで、とりあえず動くようにはなります。
(重複の判定が正しく行われるようになります)
    • good
    • 0
この回答へのお礼

仰る通りで。
ご指摘ありがとうございます。

お礼日時:2024/10/09 08:17

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A