プロが教えるわが家の防犯対策術!

いつもお世話になっております
下記のコードは
A列にあってB列にないものをD列に
B列にあってA列にないものをC列に
のコードを以前いただきました。

A列B列どちらにもあるのを抽出する
にはどうしたよろしいでしょうか

わかる方おしえてくれませんでしょうか

Sub x()
Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")

Dim i As Long, i2 As Long

For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Key = Cells(i, 1).Value
Dic(Key) = i
Next i

i2 = 2
For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Key = Cells(i, 2).Value


If Dic.exists(Key) = True Then
Dic.Remove (Key)
Else
Cells(i2, 3).Value = Key
i2 = i2 + 1
End If
Next

i = 2
For Each Key In Dic.keys
Cells(i, 4).Value = Key
Next Key



End Sub

A 回答 (7件)

新しく作り直しました。



Public Sub Y()
Dim dicT1 As Object
Dim dicT2 As Object
Dim key As Variant
Dim wrow As Long
Dim wrow2 As Long
Range("C2:E" & Rows.Count).ClearContents
Set dicT1 = CreateObject("Scripting.Dictionary")
Set dicT2 = CreateObject("Scripting.Dictionary")
For wrow = 2 To Cells(Rows.Count, 1).End(xlUp).Row
key = Cells(wrow, 1).Value
dicT1(key) = True
Next
For wrow = 2 To Cells(Rows.Count, 2).End(xlUp).Row
key = Cells(wrow, 2).Value
dicT2(key) = True
Next
wrow = 2
wrow2 = 2
For Each key In dicT1.keys
If dicT2.exists(key) = True Then
Cells(wrow, 5).Value = key
wrow = wrow + 1
Else
Cells(wrow2, 4).Value = key
wrow2 = wrow2 + 1
End If
Next
wrow2 = 2
For Each key In dicT2.keys
If dicT1.exists(key) = False Then
Cells(wrow2, 3).Value = key
wrow2 = wrow2 + 1
End If
Next
End Sub
    • good
    • 0
この回答へのお礼

すばらしいです
ありがとうございました。

お礼日時:2023/12/06 09:10

No.5です。


少し改訂したものです。

Sub md_2()
Dim myDic As Object
Dim m As Integer, v As Variant, key
Dim r As Range

Application.ScreenUpdating = False

Set myDic = CreateObject("Scripting.Dictionary")

Range("A2", Cells(Rows.Count, "A").End(xlUp)).Name = "あ1"
Range("B2", Cells(Rows.Count, "B").End(xlUp)).Name = "あ2"

For m = 1 To 2
For Each r In Range("あ" & m).Cells

If Not myDic.Exists(r.Value) Then

ReDim v(0 To 2)

If WorksheetFunction.CountIf(Range("あ" & CStr(3 - m)), r.Value) > 0 Then
v(2 - m) = "": v(2) = r.Value
Else
v(2 - m) = r.Value: v(2) = ""
End If

myDic.Add r.Value, v

End If
Next
Next

With Range("C2").Resize(myDic.Count, 3)
.Value = Application.Transpose(Application.Transpose(myDic.Items))
.SpecialCells(xlCellTypeBlanks).Delete (xlShiftUp)
End With

Application.ScreenUpdating = True

End Sub

でも以前ADOをされてたようでしたがSQL文で挑戦するのも良いかもですよ。
私は挫折しましたけど。
    • good
    • 0

No.5です。


テスト画像忘れてました。
「A列B列どちらにもあるのを抽出する」の回答画像6
    • good
    • 0

既に解決済みでご覧になられてないかもですが。



DictionaryオブジェクトのItemには配列も格納できるのでこのような方法も。

Sub md()
Dim myDic As Object
Dim m As Integer, v(2) As Variant, key
Dim r As Range

Application.ScreenUpdating = False

Set myDic = CreateObject("Scripting.Dictionary")

Range("A2", Cells(Rows.Count, "A").End(xlUp)).Name = "あ1"
Range("B2", Cells(Rows.Count, "B").End(xlUp)).Name = "あ2"

For m = 1 To 2
For Each r In Range("あ" & m).Cells

If Not myDic.Exists(r.Value) Then

v(0) = "": v(1) = "": v(2) = ""

With WorksheetFunction

Select Case True

Case .CountIf(Range("あ" & CStr(3 - m)), r.Value) > 0
v(2 - m) = "": v(2) = r.Value

Case .CountIf(Range("あ" & CStr(3 - m)), r.Value) = 0
v(2 - m) = r.Value: v(2) = ""

End Select

End With

myDic.Add r.Value, v

End If
Next
Next

With Range("C2").Resize(myDic.Count, 3)
.Value = Application.Transpose(Application.Transpose(myDic.Items))
.SpecialCells(xlCellTypeBlanks).Delete (xlShiftUp)
End With

Application.ScreenUpdating = True

End Sub

初心者ちょいのレベルなので可読不可能な点にはご容赦を。
    • good
    • 0

例えばA列を順に取得しワークシート関数のCountIfで検索範囲をB列全て検索値をA列の値で0を超えた時、順次希望の列に書き出しつつそこの行番号カウントを増やす。


ではダメなのでしょうか?
Dictionaryオブジェクトの勉強って事なら何ですが、手段に拘らないならと思いました。
逆をしたい時は検索と検索値を逆にする。
行番号のカウント変数を初期値にする。
とか?
    • good
    • 0

こんばんは



スピル機能が使える環境を想定しても良いのなら・・

E1セル等に
=UNIQUE(FILTER(B1:B100,COUNTIF(A:A,B1:B100)>0,""))
のような関数式を入力すれば、お求めの結果が得られます。

※ 式中の「100」の部分は、B列の最大行数以上の数にしておく必要があります。
※ マクロで行いたければ、上記の式をE1セル等に設定するマクロでできます。
(結果を固定値にしたければ、E列をコピー、値をペーストで固定値化できます)
    • good
    • 14
この回答へのお礼

ありがとうございます
参考にします。

お礼日時:2023/12/05 23:36

>A列B列どちらにもあるのを抽出する


>にはどうしたよろしいでしょうか

A列B列どちらにもあるのをどの列に出力したいのでしょうか。
    • good
    • 0
この回答へのお礼

早速ありがとうございます
E列でお願いいたします。

お礼日時:2023/12/05 22:32

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

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


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