お世話になります。excel2013を使用しています。
シート1のA列とシート2のD列が重複しているとき
重複しているものを抽出するためのマクロを作成しました。
しかし↓だと重複していないものを抽出してしまい、おそらく同じkyにしてRemove してるのがいけないことはわかるのですが、実際にどうしたら良いのかわかりません...。
それからシート3には重複しているA列と同じ行のD列をB列に表示させたいです。
よろしくお願いします。
Sub macro1()
Dim tbl, i As Long
Dim ky
With CreateObject("Scripting.Dictionary")
'シート1のキーを作成(C列)
tbl = Sheets("sheet1").Range("A1:A300000")
For i = 2 To UBound(tbl, 1)
ky = tbl(i, 1)
If Not .Exists(ky) Then .Add ky, Empty
Next
'シート2のキーを作成(A列)
tbl = Sheets("sheet2").Range("C1:C5000")
For i = 2 To UBound(tbl, 1)
ky = tbl(i, 1)
If .Exists(ky) Then .Remove ky
Next
'シート3に重複しているものを転記
If .Count Then
i = 1
For Each ky In .Keys
i = i + 1
'※A列に重複しているものを記載したいが
'※重複していないものになってしまう…
'※B列にはシート1のA列と同じ行のD列の値を記載したい
Sheets("sheet3").Range("A" & i) = ky
Sheets("sheet3").Range("B" & i) = ky '※??
Next
End If
End Sub
No.1ベストアンサー
- 回答日時:
こんにちは!
画像を拝見すると、重複しているのは
「□■■」と「○●○」ですよね。
一例です。
標準モジュールにしてください。
尚、Sheet1のA列・Sheet2のC列とも重複データはない!という前提です。
Sub Sample1()
Dim myDic1 As Object
Dim myDic2 As Object
Dim i As Long, lastRow As Long
Dim wS1 As Worksheet, wS2 As Worksheet
Dim myKey, myItem, myR
Set myDic1 = CreateObject("Scripting.Dictionary")
Set myDic2 = CreateObject("Scripting.Dictionary")
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
With Worksheets("Sheet3")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow, "B")).ClearContents
End If
lastRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(wS1.Cells(2, "A"), wS1.Cells(lastRow, "D"))
For i = 1 To UBound(myR, 1)
If Not myDic1.exists(myR(i, 1)) Then
myDic1.Add myR(i, 1), myR(i, 4)
End If
Next i
lastRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row
myR = Range(wS2.Cells(2, "C"), wS2.Cells(lastRow, "C"))
For i = 1 To UBound(myR, 1)
If myDic1.exists(myR(i, 1)) Then
myDic2.Add myR(i, 1), myDic1(myR(i, 1))
End If
Next i
myKey = myDic2.keys
myItem = myDic2.items
myR = Range(.Cells(2, "A"), .Cells(UBound(myKey) + 2, "B"))
For i = 0 To UBound(myKey)
myR(i + 1, 1) = myKey(i)
myR(i + 1, 2) = myItem(i)
Next i
Range(.Cells(2, "A"), .Cells(UBound(myKey) + 2, "B")) = myR
Set myDic1 = Nothing
Set myDic2 = Nothing
.Activate
End With
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
No.2
- 回答日時:
こんにちは
>おそらく同じkyにしてRemove してるのがいけないことはわかるのですが、~
その通りですね。
重複しているかどうかは、Sheet2のデータについて
If .Exists(ky)
で判定できるので、重複していたら(削除ではなく)Sheet3に書き出すという処理になるのではないでしょうか?
ただし、上記のように順次出力すると、Sheet2内でデータの重複がある時に、それがダブって出力されてしまう可能性があります。
これを省くには、
1)ひとまず出力して、後からSheet3上で重複を削除する。
あるいは
2)Sheet3に出力して、(その後、同じデータが重複と判断されないように)
Dictionaryからそのkeyを削除しておく。
といった対応をすることで、処理が可能と思います。
2)の方法で「削除」の代わりに、(現在利用していない)Dictionaryのvalue値をEmpty以外にセットしておくようなことも考えられます。
value値がEmpty以外だったら「既に出力済み」とわかるので、2回目以降は出力しないようにできますよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】CSV取込時、数字...
-
Word2016でExcelデータを差込し...
-
エクセルで前年同日・前月同日...
-
Excel 表の必要箇所だけを抜き...
-
EXCEL2007で2つのシートのどっ...
-
excelの列がいっぱいになり列を...
-
EXCELの列の幅
-
EXCELで2つのシートから一致し...
-
エクセルの複数ワークシートの...
-
エクセルの余白を0にしても列...
-
エクセルで電話番号にハイフン...
-
エクセルで縦線のいっぱい入っ...
-
エクセルでページ毎の計をつけ...
-
EXCELで不良率を出そうと思って...
-
エクセルで、列や行の幅などセ...
-
エクセルVBAで複数列データを1...
-
VBAで他のシートの特定の列を検...
-
ExcelのIF関数について
-
VBAで列に計算式を入れたい
-
エクセルの列の非表示、削除に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Word2016でExcelデータを差込し...
-
【Excel VBA】CSV取込時、数字...
-
EXCELで2つのシートから一致し...
-
Excel 表の必要箇所だけを抜き...
-
EXCELの列の幅
-
エクセルでページ毎の計をつけ...
-
エクセルで前年同日・前月同日...
-
excelの列がいっぱいになり列を...
-
EXCEL2007で2つのシートのどっ...
-
エクセルで電話番号にハイフン...
-
EXCELで不良率を出そうと思って...
-
エクセルVBAで複数列データを1...
-
ExcelのIF関数について
-
順位表において先週と今週の数...
-
エクセルで2列以上のものを同時...
-
ピボットテーブル作成後、重複...
-
エクセルの余白を0にしても列...
-
(形式直し)Sheetの表のサイズ...
-
エクセルで縦線のいっぱい入っ...
-
SUMPRODUCT関数で複数条件適用...
おすすめ情報