配列の重複を取る関数を作成する。【Excel VBA】

VBA

重複を含む配列から重複を除去する為の関数を作成します。この記事では、外部サイトからのコードを引用して、不明だった箇所を解説していきます。

参照元の外部サイト

重複を取る為に使用した関数は下記になります。

Private Sub DeleteSameValue1(ar())
'****配列内で同じ文字列を削除して、配列を小さくする。********

    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary")  '// 重複を除いた値を格納するDictionary
    Dim i                       '// ループカウンタ1
    Dim ii                      '// ループカウンタ2
    Dim iLen                    '// 配列要素数
    Dim arEdit()                '// 編集後の配列
    
    ReDim arEdit(0)
    iLen = UBound(ar)
    
    '// 配列ループ
    For i = 0 To iLen
        '// 配列に未登録の値の場合
        If (dic.Exists(ar(i)) = False) Then
            '// Dictionaryに追加
            Call dic.Add(ar(i), ar(i))
            
            '// 重複がない値のみを編集後配列に格納する
            arEdit(UBound(arEdit)) = ar(i)
            ReDim Preserve arEdit(UBound(arEdit) + 1)
        End If
    Next
    
    '// 配列に格納済みの場合
    If (IsEmpty(arEdit(0)) = False) Then
        '// 余分な領域を削除
        ReDim Preserve arEdit(UBound(arEdit) - 1)
    End If
    
    '// 引数に編集後配列を設定
    ar = arEdit
End Sub

参考にさせていただきました、元の外部リンクは下記になります。

関数を使用してみると確かに上手く重複が除去できます。しかしながら、どういう処理をしているのか全くわかりませんでした。

特に
dic.Exists(ar(i)) = False
等、dic.で記載されている部分が不明でした。

この関数で最も使いたいメソッドは”Exists”メソッド

この関数で最も良い仕事をしているのは、まさに、この”Exists”メソッドになります。

何ができるのかと言うと、「指定したキーが存在すればTrueを返す」です。

上のコードでの使い方は、
これから配列内に新しい要素(新要素)を追加しようとした際に、
新要素と同じものが配列内に存在するかどうかをTrueかFalseで返してくれます。

配列内に新要素と同じものが存在すれば、配列に新要素を追加せず、
新要素を同じものが存在しなければ、配列に新要素を追加すれば、重複の無い配列が作成できます。

Existsメソッドを使うために、Dictionaryオブジェクトが必要。(Dictionaryオブジェクトとは?)

Existsメソッドを使うためのDictionaryオブジェクトについて記載します。

Dictionaryオブジェクトは、連想配列を使用するオブジェクトです。連想配列とは、”キー”と”データ”をセットで格納することができる配列です。

このオブジェクトでは、この連想配列に対する操作が可能です。

ちなみに、Exists以外のメソッドを紹介しておくと、

・addメソッド で、値を格納できます。順番はキー、アイテムの順番です。
・Itemメソッド で、dictionary内のアイテムの値を配列で返します。
 ※a(配列)=(dictionaryオブジェクト).Items みたいな書き方。

詳しくは以下のサイトに記載されています。

Dictionaryオブジェクトを使うにはCreateObject関数

Dictionaryオブジェクトは、外部ライブラリを参照しないと使えないオブジェクトです。このような場合は、CreateObject関数を使用します。

    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary") 

↑のような使い方をします。CreateObject関数の引数は、

アプリケーション名.クラス名

になります。

まとめ

以上、今回の記事では、配列の重複を取る関数についてコード、特にDictionary関数の部分の解説をしました。こういう少し複雑な処理を含むコードを書く場合は、使用したいメソッドから考えて関数コードを設計した方が良いのかもしれません。

自分で考えて作ろうと思ったらできないこともないですが、既にライブラリがあるのであればそちらを使った方が短時間で作成できます。

コメントを入力

タイトルとURLをコピーしました