列挙を合わせて重複を除くユーザー定義関数

複数の列挙テキストを一つにまとめて、重複のない列挙に整理しなおすユーザー定義関数です。「AAA、BBBB、CCC」と「AAA、DD」から、「AAA、BBBB、CCC、DD」を導出します。

複数の列挙をつなげて重複を除く関数

Function uf_重複なし列記(RNG As Range, DLM As String)

    Dim buf As String
    Dim ary1, ary2

    buf = WorksheetFunction.TextJoin(DLM, True, RNG)
    ary1 = Split(buf, DLM)
    ary2 = WorksheetFunction.Unique(ary1, True)
    uf_重複なし列記 = Join(ary2, DLM)
End Function

長くはなりますが、変数を使わないで一文でまとめることもできます。

Function uf_重複なし列記(RNG As Range, DLM As String)
    Join(WorksheetFunction.Unique(Split(WorksheetFunction.TextJoin(DLM, True, RNG), DLM), True), DLM)
End Function

利用方法

=uf_重複なし列記(セル範囲,区切り文字)

セル範囲は、C3のような単一セルまたはC3:E3のような範囲を指定します。

個人用マクロブックに保存した場合は、

=PERSONAL.XLSB!uf_重複なし列記(C3:E3,"・") のような数式になります。

解説

各セルのテキストを一つにつなげてから区切り文字で分解して配列にします。配列から重複を排除して、一つのテキストにつなぎ直しています。Excel 365 で追加されたワークシート関数を使うことで、For Next 文を使わないシンプルなコードにできました。

WorksheetFunction.TextJoin関数

複数のセルのテキストを指定する区切り文字を加えて連結する関数です。
WorksheetFunction.TextJoin("区切り文字", 空セルを無視セル範囲)

WorksheetFunction.Unique関数

ワークシートの数式でセル範囲を指定するところを配列を指定しています。VBAのワークシート関数では、配列を渡して重複のない配列を返す使い方ができます。
WorksheetFunction.Unique(配列, 重複排除)

従来、配列からの重複排除は Dictionary オブジェクトの特性を転用するなど少々面倒なものでしたが、Unique関数によって簡単に実装できるようになりました。

 

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