|
▼β さん:
判定をA列同士で行って、結果表示はSheet2の重複した横のB列を表示するというのをdl.Offset(0, 1)以外で思いつかないのですが、何か良い案はないでしょうか・・・
それともdl.Offset(0, 1)を使って表示できるが、私の書き方がミスっているから表示できないのでしょうか・・・
>▼あや さん:
>
>おっとぉ!
>難易度がぐ〜んとアップしましたね。
>Dictionaryでの(直接)比較は、ワイルドカードがつかえませんので
>すべてをなめて、Like 判定をするという手もありますが、ちょっと別の方法を考えてみます。
>(老化進行防止のための、いいトレーニングになります)
>
>ところで、部分一致ですが
>
>Sheet2の語句がSheet3の語句と部分一致
>Sheet3の語句がSheet2の語句と部分一致
>
>どちらでしょうか?
>
>なお、重複表示をB列にすることは問題ありません。
>
>
>>▼β さん:
>>なるほど・・・
>>シート3で重複しているものも全て表示させようとしたため
>>dl.Add c.Valueという書き方をしているのですね。
>>また結果表示も同じものも表示させるために、重複を見つけるたびにv(i)に格納していくのですね。
>>有難うございます。
>>
>>またまた質問で申し訳ないのですが・・・
>>1.今回の処理はセル同士を見比べているので、セルの値が完全一致のものを表示させていると思うのですが、これを部分一致にさせることというのは可能なのでしょうか(lookat:=xlPartのような・・・)
>>2.見比べはシート2とシート3のA列で行うのですが、結果表示をさせるときにシート2のA列の結果ではなく、シート2のB列の結果を表示させる、ということは可能でしょうか。
>>(B列に地区名が入っていて、知りたいのは重複した名前の人の地区というような・・・
>>dl.Offset(0, 1)を使うとうまくいかなかったもので・・・)
>>
>>何度も申し訳ありません。
>>
>>>▼あや さん:
>>>
>>>まず、このコードは2つの入れ物を使っています。
>>> 1つが Dictionary と呼ばれるもの。もう1つがArrayListと呼ばれるものです。
>>>いずれもVBAの持ち物ではなく 外部(.Net等)の機能なので、CreateObject で呼び出して使用。
>>>
>>>Dictionary は同じキーを格納した時に上書きされる特徴をもっていて、コードでは
>>>Sheet2の名前を格納するのに使っています。山田が何件あろうと1件の山田になります。
>>>
>>>ArrayListは、キー/データという概念はないのですが同じ値を別のものとして格納可能です。
>>>コードでは、重複のあったものを格納するのに使っています。Sheet3 に山田が3件あれば3件格納されます。
>>>また、ArrayListは格納されたものを昇順、降順に並び替える機能もあります。
>>>エラーメッセージで
>>>山田
>>> 佐藤
>>> 山田
>>> 佐藤
>>>とだすより
>>>山田
>>> 山田
>>> 佐藤
>>> 佐藤
>>>とだすほうがわかりやすいので、この昇順並び替え機能を使っています。(これが dl.Sort です)
>>>
>>>Dictionaryには、Existsメソッドがあり、ある値が、Dictionaryのキーとして格納されているかどうかの
>>>判定ができます。それが dic.exists(c.Value) で、このメソッドが返す結果が True なら
>>> 重複しているということになりますので、それを dl.Add c.Value でArrayList に登録しています。
>>>
>>>ArrayListに格納した内容は、VBAからは一挙に取り出せないので、ArrayListと同じ大きさの
>>>ReDim v(0 To dl.Count - 1) で1次元配列をつくり、その配列に、ArrayListからインデックスを与えながら
>>>v(i) = dl(i) で、データを取り出しておさめています。
>>> (ArrayListのインデックスは 0 から始まっています)
>>>
>>>さて、重複側を、あえてその件数だけすべて表示するという要望でしたのでArrayListを使いましたが
>>>集約して1件にして表示するなら、重複情報も ArrayListではなくDictionary に格納して重複をなくす
>>> ことができます。
>>>
>>> 以下でお試しください。
>>>
>>>Sub Test2()
>>> Dim dic As Object
>>> Dim dl As Object
>>> Dim i As Long
>>> Dim v As Variant
>>> Dim c As Range
>>>
>>> Set dic = CreateObject("Scripting.Dictionary")
>>> Set dl = CreateObject("Scripting.Dictionary")
>>>
>>> With Sheets("Sheet2")
>>> For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
>>> dic(c.Value) = True
>>> Next
>>> End With
>>>
>>> With Sheets("Sheet3")
>>> For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
>>> If dic.exists(c.Value) Then dl(c.Value) = True
>>> Next
>>> End With
>>>
>>> If dl.Count > 0 Then
>>> MsgBox "以下の重複がありました" & vbLf & Join(dl.keys, vbLf)
>>> Else
>>> MsgBox "重複はありませんでした"
>>> End If
>>>
>>>End Sub
|
|