LWP | 重複除去の前に「重複」の意味を決める
重複除去の前に「重複」の意味を決める
品番、判定キー、残す行を、6枚の図で整理する
ストーリー
「この一覧、ダブりを消せる?」。会議を控えた営業のナマズさんが、シャケもんへ商品一覧を持ってきました。でも、001と1は別の商品。見た目を整えるだけでは、大事な区別まで失ってしまいます。
二人が、営業上の条件とVBAの処理をすり合わせる説明用の物語です。後半ではTakiLib Ver 3.5.4のseqUniqueを例に、重複判定の仕組みを見ていきます。
1 同じ数字なら、同じ商品?

図1|数値へ変換してからでは、失った品番の区別を戻せない。
2 比べるキーと、残すデータ

図2|判定に使う項目と、結果に残す情報を分けて考える。
3 初めて出たものだけ残す

図3|重複が見つかっても処理全体は止めず、次の要素へ進む。
4 二つの方法、同じ比較とは限らない

図4|見つけ方を替えるときは、何を同じと判定するかも確認する。
5 同じ値のセルでも、セルは別

図5|セルの場所、セルの値、結果に残す元要素を混同しない。
6 消す前に、残すルールを決める

図6|「最初を残す」と「最新を残す」は、違う依頼。
まとめ
重複除去では、先に「同じと見なす条件」と「残す元データ」を決めます。営業側は品番の意味や採用したい行を伝え、実装側はその条件に合うキーと比較方法を選ぶ。二つがそろって、必要な情報を残せます。
今回の仕掛け
seqUniqueは、判定用のキー候補と元要素を分けて処理します。既定のDictionary方式では、未登録のキーにだけ元要素を登録します。比較方式では、既存キーをvalueInSequenceからvalueEqualで調べ、初出の元要素を結果へ追加します。
図2は業務設計の概念図です。seqUniqueが任意のレコードから品番列を自動で選ぶわけではありません。品番をキーにして行全体を残す処理は、別途設計します。また「最初」は入力の走査順であり、「最新」を保証しません。
図5は単一セルを例にした説明です。a_invoke_dpはキー候補を作る際の既定プロパティの扱いを切り替える指定で、元シートのセルを削除する指定ではありません。
今回のソースコードのサンプル
サンプルコード seqUniqueで品番の重複を除く
01 |
|
|---|---|
02 |
|
03 |
|
04 |
|
05 |
|
06 |
|
07 |
|
### 関数とコードの説明
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 山中 一弘
本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。
