[[20150827194028]] 『重複データを調べる方法(COUNTIF以外)』(moto) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『重複データを調べる方法(COUNTIF以外)』(moto)

ABCD
あ あ
う い
く う
  え
  お

・A列に記入されたデータが、C列に存在するかを調べたいです。
・A列C列共に、数万行単位のデータが入力されています。
・COUNTIFやVLOOKUPを検討しましたが、参照範囲(C列)が広いことから、非常に重たい処理になってしまうため、代案を探しています。

御教示頂けますと幸いです。何卒宜しくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 関数でやるなら、C列を昇順に並べ替えてから(振り仮名を使わないモード)、LOOKUP関数を使う。
 それで、C列は数十個程度と同等の意味になります。
 ただ、A列の方はどうしようもないので、
 どれくらい改善するかは、結局やってみないと分からないです。

 C列の並べ替えが無理なら(=ありのままでやらないといけないのでしたら)、
 VBAのDictionaryオブジェクトを活用することになると思います。
 こっちはかなり速いです。私はコードを書く気はないですけど。

 ところで「重複データが存在した場合」どの様な出力結果にするんですか?
 それが分からないと、関数でも、VBAでも具体案は作れないです。

(半平太) 2015/08/27(木) 20:20


 とりあえず、Dictionaryを使い、重複があったA列のセルを赤く色塗りします。

 Sub Test()
    Dim dic As Object
    Dim c As Range
    Dim r As Range

    Set dic = CreateObject("Scripting.Dictionary")
    For Each c In Range("C1", Range("C" & Rows.Count).End(xlUp))
        dic(c.Value) = True
    Next

    With Range("A1", Range("A" & Rows.Count).End(xlUp))
        .Interior.ColorIndex = xlNone
        For Each c In .Cells
            If dic.exists(c.Value) Then
                If r Is Nothing Then
                    Set r = c
                Else
                    Set r = Union(r, c)
                End If
            End If
        Next
        If Not r Is Nothing Then r.Interior.ColorIndex = 3
    End With

 End Sub

(β) 2015/08/27(木) 20:48


お返事が遅くなりまして申し訳ありません。

私の勉強不足で、
>昇順に並べ替えてからLOOKUP関数
の方法だと正しい結果がでませんでした。

言葉不足で申し訳ありませんでしたが、
B列に”重複”なり、抽出結果が分かるようにできればと思ってました。

β様に教えて頂きましたコードを元に、見事に思い描いていたコードが書けました。
速度が大幅に改善されました。
(まだDictionaryオブジェクトの仕組みについては???ですが…調べて勉強していきます。)

ありがとうございました。勉強続けています。
(moto) 2015/08/31(月) 23:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.