いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)大文字と小文字を区別して重複削除する方法

 ExcelではUNIQUE関数や「重複の削除」メニューでデータの重複削除ができますが、大文字と小文字が区別されません。そこで大文字と小文字を区別してそれぞれ別の値として残るようにする方法を紹介します。
 ただし全角半角も区別される等の注意点があります(下記備考参照)。

SUMPRODUCT関数等を使う方法

 手順は少し長くなりますが、なるべく単純な関数とメニューを組み合わせて実行する方法です。
 基本的に旧バージョン用のやり方ですので、UNIQUE関数等が使える場合は次以降の方法を試してください。


 まずD3セルに次の数式を入力してD12セルまでフィルコピーします。

 D3セル(下方にフィルコピー)

=IF(SUMPRODUCT(EXACT(B3,B$3:B3)*1)=1,ROWS(B$3:B3),1)

 同じ行のB列の値を厳密に比較し、初めて現れるものであればその位置(B3セルから数えて〇番目)を、そうでなければ「1」を返す式です。同じ値に同じ番号を返すわけではないのがちょっとした注意点です。「1」のうち2番目以降に現れるものは重複値として以下の手順により削除されます。
 「ROWS(B$3:B3)」の部分は連番を生成する部分です。以下ですぐに値として貼り付けられるので、単に「ROW(A1)」としてもいいです。



 次にD3~D12の範囲を選択してコピー(Ctrl+C)し、そのまま値を貼り付けます(右クリックして「値」を選択)。
 これを忘れると誤った結果となりますので注意してください。

 


 さらにD3~D12の範囲を選択した状態で「データ」タブ内の「重複の削除」アイコンをクリックします。

 


 ダイアログが出ますがそのままOKをクリックします。
 隣の列に値があると、この画面の前に確認メッセージが出ますが、いずれ他の列を巻き込まないよう注意してください。

 


 これで数値の重複が除かれました。
 データには(大・小文字を区別すれば)7種類の値があり、それらは1,2,3,5,7,8,9番目に(初めて)現れるということを意味しています。

 


 最後にE3セルに数式を入力してE9セルまでフィルコピーすれば完成です。

 E3セル(下方にフィルコピー)

=INDEX(B$3:B$12,D3)

 INDEX関数を使い、それぞれの数値(〇番目)に対応する値をB列から抽出しています。

XMATCH/UNIQUE関数等を使う方法

 これらの関数が使えるならかなり簡単に済みます。
 まずはD3セルに次の数式を入力してD12までフィルコピーします。

 D3セル(下方にフィルコピー)

=XMATCH(TRUE,EXACT(B3,B$3:B$12))

 B3セルの値と正確に等しい値が、B3~B12セルのうち何番目にはじめて出現するかを取得します。
 具体的にはB3セルとB3~B12セルを厳密に比較した10個の結果(TRUE/FALSE)を取得し、XMATCH関数を使って最初のTRUEが何番目に現れるかを取得しています。フィルコピーすることによりB4以降の各セルについて同様の結果が得られます。



 そしてE3セルに次の数式を入力すれば完成です。

 E3セル

=INDEX(B3:B12,UNIQUE(D3:D12))

 UNIQUE関数で数値の重複を除きINDEX関数の引数とすることで、数値(〇番目)に対応するB列の値を一括取得しています。

1つの式で実行する方法

 1つの数式で実行する方法です。

 D3セル

=INDEX(B3:B12,
UNIQUE(MAP(B3:B12,LAMBDA(x,XMATCH(TRUE,EXACT(x,B3:B12)))))
)

 基本的にINDEX/UNIQUE関数を使って1つ上の例と同じことをやっていますが、ちょっと面倒なのが「MAP(B3:B12,LAMBDA(x,XMATCH(TRUE,EXACT(x,B3:B12))))」の部分です。これはMAP/LAMBDA関数を使いB3:B12の範囲をxと名付け、その1つ1つのセルについて「XMATCH(~,EXACT(~))」を実行した結果取得します。つまり「XMATCH(TRUE,EXACT(B3,B3:B12))」から「XMATCH(TRUE,EXACT(B12,B3:B12))」までを一括して実行し、結果の配列を取得します。
 「EXACT(x,x)」としてしまうと「EXACT(B3:B12,B3:B12)」と同様に、同じセル同士を比べた結果(TRUEが10個)が返ってくるだけなのでうまくいきません。

備考

 次の画像では、対象データの値を変えたうえで、単純にUNIQUE関数を使った式「=UNIQUE(B3:B12)」の結果と、上記3つの方法の結果を比較しています。

 画像からわかるように、UNIQUE関数だけの場合は大文字と小文字だけでなく全角と半角も区別されません。3つの方法の場合は大・小文字も全・半角も区別されます。
 また、UNIQUE関数だけの場合は数値と「文字列の数字」が区別されますが3つの方法の場合は区別されません。
 さらにUNIQUE関数だけの場合は空白セル(未入力)と空文字列("")が区別され空白セルに対しては0が返りますが、3つの方法の場合は区別されずに空文字列が返ります。