重複排除して二次元配列を作る(Dictionary版)
Q&Aで割とよくある質問で、シートにあるデータから重複を排除してリストボックス(あるいはコンボボックス)に入れたいってのがあります。
データが1列しかない場合は割と素直にできるのですが、2列以上となるとちょっちメンドクサイです。
方法はいくつかありますが、やはり二次元配列にデータを入れて、ListプロパティまたはColumnプロパティに突っ込むのがスマートな気がします。
重複排除の判定には、Dictionary に 同一キーでAddするとエラーになるってのを今回は利用することにします。
例えば、図のようなデータがシートにあり、A列がユニークな行について、A,B列のデータを二次元配列に入れる場合を考えてみます。
※.A列は数値です。
' 参照設定:Microsoft Scripting Runtime Sub Macro1() Dim dicA As Scripting.Dictionary Dim rngU As Range Dim r As Range Dim i As Long Dim aryX() As String Set dicA = New Scripting.Dictionary Set rngU = Worksheets("Sheet1").Range("A2:A8") On Error Resume Next For Each r In rngU Err.Clear ' ◆◇◆◇◆◇◆◇◆◇ dicA.Add Key:=r, Item:=Empty ' NG 'dicA.Add Key:=r.Value, Item:=Empty ' OK ' ◆◇◆◇◆◇◆◇◆◇ If Err.Number = 0 Then i = i + 1 ReDim Preserve aryX(1 To 2, 1 To i) As String aryX(1, i) = r.Text aryX(2, i) = r.Offset(, 1).Text Debug.Print aryX(1, i), aryX(2, i), i End If Next r On Error GoTo 0 End Sub
実行すれば分かりますが、実はこのコードの結果は要件を満たしません。
重複が排除されないのです。
◆◇◆で印を付けた部分がNGです。
後ろにコメントアウトしたコードのようにすればOKです。
つまり、Valueプロパティを省略してはイケナイってことです。
これも、デフォルトプロパティを省略することによる不具合ですね。
省略による不具合は他にもあるので、よく知っている人は省略しないでしょうけど。
(Excel 2002 で実験)
※.Excel World の 2007年7月16日 17:25 の日記をコピーしています。
http://excel.sns.fc2.com/excel/