PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

重複しているデータを抽出して、重複しないリストを作成してみよう!【ExcelVBA・エクセルマクロ】

今回は、以下のようなリストにおいて、
重複しないように名前とメールアドレスを抽出(抜き出す)方法
を考えてみたいと思います。

Sheet1

 ABCDE
1属性氏名フリカナ性別メールアドレス
2A組伊沢兼吉イザワカネキチkanekichi4638@ckttcy.wg
3B組岩沢治イワサワオサムuiwasawa@nreysk.cf
4C組岩沢治イワサワオサムuiwasawa@nreysk.cf
5C組山村治雄ヤマムラハルオharuo46035@clsbm.ph
6B組山村治雄ヤマムラハルオharuo46035@clsbm.ph
7A組小杉暢興コスギノブオキsi_qhsnobuoki8904@ouhqgmi.lj
8C組中塚明紀ナカツカアキノリakinori5981@xajv.xb.xa

Sheet2

 ABCDE
1属性氏名フリカナ性別メールアドレス
2A組伊沢兼吉イザワカネキチkanekichi4638@ckttcy.wg
3B組岩沢治イワサワオサムuiwasawa@nreysk.cf
4C組山村治雄ヤマムラハルオharuo46035@clsbm.ph
5A組小杉暢興コスギノブオキsi_qhsnobuoki8904@ouhqgmi.lj
6C組中塚明紀ナカツカアキノリakinori5981@xajv.xb.xa
匿名個人情報の生成はhogehoge.tk様のWEBサービスをお借りしました。ありがとうございます。

ポイント

  1. 連想配列のKeyに名前、対応する値にメールアドレスを登録する。
  2. ここでは、登録されたデータを「Sheet2」へ貼り付けています。

ソースコード

Sub OverlappedDataExtraction()

Dim Dictionary As Object

    Set Dictionary = CreateObject("Scripting.Dictionary")
    
    With Worksheets("Sheet1")
    
        For i = 1 To .Range("A65535").End(xlUp).Row
            'Key
            KeyBuffer = .Range("B" & i).Value
            'Element
            StringBuffer = .Range("E" & i).Value
            
            If Not Dictionary.Exists(KeyBuffer) Then
                
                Dictionary.Add KeyBuffer, StringBuffer
            
            End If
        
        Next i
    
    End With
    
    With Worksheets("Sheet2")
    
        For i = 0 To Dictionary.Count - 1
    
            .Range("A" & i + 1) = Dictionary.Keys()(i)
            .Range("B" & i + 1) = Dictionary.Items()(i)
                
        Next i
    
    End With

End Sub

発生しやすいエラーについて

  • Property Let プロシージャが定義されておらず、Property Get プロシージャからオブジェクトが返されませんでした。

f:id:ivclo:20150501224527p:plain
上記のようなエラーが出た場合、以下を点検してください。

  • .Range("A" & i + 1) = Dictionary.Keys()(i)
  • .Range("B" & i + 1) = Dictionary.Items()(i)

上記の()がない場合には、エラーが出る場合があります。

原因は、公式ドキュメントに書いてあります。

正直、細部まではわからないのですが。
Dictionary型から、直接取り出すことは出来ないといったことのようです。

配列として取り出すには、いったんVariant型変数に格納することで解決します。

Dim Temp as Variant
Temp = Dictionary.Items
.Range("B" & i + 1) = Dictionary.Items(i)