重複除去の前に「重複」の意味を決める

LWP | 重複除去の前に「重複」の意味を決める

重複除去の前に「重複」の意味を決める

品番、判定キー、残す行を、6枚の図で整理する

ストーリー

「この一覧、ダブりを消せる?」。会議を控えた営業のナマズさんが、シャケもんへ商品一覧を持ってきました。でも、001と1は別の商品。見た目を整えるだけでは、大事な区別まで失ってしまいます。

二人が、営業上の条件とVBAの処理をすり合わせる説明用の物語です。後半ではTakiLib Ver 3.5.4のseqUniqueを例に、重複判定の仕組みを見ていきます。

1 同じ数字なら、同じ商品?

文字列の商品コード001と1を数値へ変換すると、どちらも1になる。ナマズさんは別商品だと伝え、シャケもんは先頭のゼロを保つ条件を確認する。

図1|数値へ変換してからでは、失った品番の区別を戻せない。

2 比べるキーと、残すデータ

品番A・メモ初回と、品番A・メモ再送は異なるレコードだが、品番だけをキーにすると同じAになる。ナマズさんが最初の行を残すと決める。

図2|判定に使う項目と、結果に残す情報を分けて考える。

3 初めて出たものだけ残す

文字列A、A、Bを順に調べる。最初のAを登録し、二つ目のAは追加せず、次のBを登録する。結果にはAとBが残る。

図3|重複が見つかっても処理全体は止めず、次の要素へ進む。

4 二つの方法、同じ比較とは限らない

TakiLib seqUniqueのDictionary方式はExistsでキーを照会し、比較方式は既存キーを順にvalueEqualで比べる。型や文字の比較規則が同じとは決めつけない。

図4|見つけ方を替えるときは、何を同じと判定するかも確認する。

5 同じ値のセルでも、セルは別

A1とA2は別の場所にあるが、どちらの値もA。seqUniqueのa_invoke_dpがTrueなら、Rangeなどの既定プロパティを判定キー候補にする。返す元要素とは区別する。

図5|セルの場所、セルの値、結果に残す元要素を混同しない。

6 消す前に、残すルールを決める

先頭ゼロ、前後空白、大小文字、残す行の条件を整理する。ナマズさんは文字列の品番を保持して最初の行を残すと依頼するが、最新価格の追加要望には条件の見直しが必要になる。

図6|「最初を残す」と「最新を残す」は、違う依頼。

まとめ

重複除去では、先に「同じと見なす条件」と「残す元データ」を決めます。営業側は品番の意味や採用したい行を伝え、実装側はその条件に合うキーと比較方法を選ぶ。二つがそろって、必要な情報を残せます。

今回の仕掛け

seqUniqueは、判定用のキー候補と元要素を分けて処理します。既定のDictionary方式では、未登録のキーにだけ元要素を登録します。比較方式では、既存キーをvalueInSequenceからvalueEqualで調べ、初出の元要素を結果へ追加します。

図2は業務設計の概念図です。seqUniqueが任意のレコードから品番列を自動で選ぶわけではありません。品番をキーにして行全体を残す処理は、別途設計します。また「最初」は入力の走査順であり、「最新」を保証しません。

図5は単一セルを例にした説明です。a_invoke_dpはキー候補を作る際の既定プロパティの扱いを切り替える指定で、元シートのセルを削除する指定ではありません。

今回のソースコードのサンプル

サンプルコード seqUniqueで品番の重複を除く

01

Public Sub Test_Main()

02

    Dim x_result As Variant, x_code As Variant

03

    x_result = seqUnique(Array("001", "1", "001"))

04

    For Each x_code In x_result

05

        Debug.Print x_code

06

    Next

07

End Sub

### 関数とコードの説明

seqUniqueは、入力した並びから重複を除き、初出の元要素を配列で返すTakiLibの関数です。ここでは文字列の品番をArrayで渡し、戻り値をx_resultで受け取ります。省略したa_use_dictとa_invoke_dpはともにTrueで、既定のDictionary方式を使います。For Eachは返された各品番を表示します。

入力・準備

TakiLib Ver 3.5.4を導入したWindows版Excelのブックを使います。同じVBAプロジェクトの別の標準モジュールへ上記全文を貼り付け、Test_Mainを実行してください。TakiLib本体と依存処理が必要で、この7行だけでは動きません。元シートは変更しません。

結果

原ソースの処理から予測される出力は、イミディエイトウィンドウに001、1の順で各1行です。品番は引用符で囲んだ文字列のまま渡しているため、001を数値の1に変換しません。今回はExcelでの実行確認は行っていません。

読むポイント

三つ目の001は既出なので結果へ追加されません。重複判定はseqUniqueへ任せ、呼び出す側は入力と結果を扱います。この例は品番の文字列だけを返す例であり、任意のレコードから品番を選んで行全体を残す処理は別途必要です。

出典メモ

  • Microsoft Learn:Existsメソッド。Dictionaryに指定キーがあるかを調べる動作を参照。

  • Microsoft Learn:CompareModeプロパティ。文字列キーの比較方法と設定条件を参照。

  • TakiLib Ver 3.5.4、seqUniqueおよび元資料に掲載されたvalueInSequenceの処理を参照。2026年9月12日に原ソースと照合。掲載説明はソース読解・仕様によるもので、混在型・Null・配列・オブジェクトの全組み合わせを実測したものではありません。

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。