いきなり答える備忘録

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

(Gスプレッドシート)厳格な値の重複チェックをする

 Googleスプレッドシートでのデータの重複チェックについてです。
 通常はCOUNTIF関数が用いられますが文字種の違いをほとんど区別しないので、厳密に値を比較したい場合は別のやり方を用意する必要があります。別のカウントの仕方による方法も考えられますが、ここではより実験的な方法を試してみます。

  • COUNTIF関数による重複チェックでは大文字と小文字、全角と半角などの区別ができません。
  • UNIQUE関数を使ってより厳格な比較ができます。ただし重複の有無は識別できるもののカウントはできません。

手順

 まずはCOUNTIF関数の例です。C3セルにCOUNTIF関数を使った式を入力して下方にコピーすることで、B列のそれぞれの値がいくつずつあるかカウントしています。

 Excelでも大文字と小文字の区別をせずカウントするなど厳密ではありませんがGoogleスプレッドシートはさらに緩く、全角と半角、ひらがなとカタカナも区別なくカウントすることがわかります。


 ちなみに数字に全角数字を含めると、その値だけが「2」とカウントされる謎の結果も起こります。

UNIQUE関数を使う方法

 以上を踏まえ、ここではUNIQUE関数を使った判定を行っています。
 長いですが次のような式を用います。
 これで重複ありはTRUE、重複なしがFALSEと表示されます。


 D3セル(下方にコピー)

=ROWS(UNIQUE(B$3:B$17,,TRUE))=ROWS(UNIQUE({B$3:B$17;B3},,TRUE))

 考え方は次のとおりです。

  1. 左側の「ROWS(UNIQUE(B$3:B$17,,TRUE))」で、範囲内にもともと1つしかない値がいくつあるか数える(UNIQUEの第3引数=TRUE)。
  2. 右側の「ROWS(UNIQUE({B$3:B$17;B3},,TRUE))」で、範囲にB3セルを付け加えたときに1つしかない値がいくつになるか数える。
  3. B3セルの値がもともと他の値と重複しているならば1.と2.の結果は同じ(TRUE)、もともと重複していなかったなら2.の結果は1.より1つ減る(FALSE)。

 これにより重複は検知できるものの、同じものがいくつあるかのカウントはできません。

重複セルに色を塗る

 定番ネタの色塗りです。
 B3:B17の範囲を選択してメニューから「表示形式」→「条件付き書式」と選択、あとはセルの書式設定の条件を「カスタム数式」として下記の式を入力すれば完成です。

 式は面倒ですが、UNIQUE関数はEXACT関数以上に厳格に値を比較するため効果はてきめんです。

 カスタム数式

=ROWS(UNIQUE(B$3:B$17,,TRUE))=ROWS(UNIQUE({B$3:B$17;B3},,TRUE))

 空白セルを塗ってしまうのが嫌な場合は「=IF(ISBLANK(B3),FALSE,上記の式)」などとすればOKです。

複数列の全体で重複を判定する場合

 上記の内容の延長で実現できますが、詳しくは次の記事で紹介しています。

www.officeisyours.com

備考

 重複していない値が全くない場合に、UNIQUE関数の結果がエラーになるため式全体もエラーになるのではないかと思われるかもしれません。
 しかしGoogleスプレッドシートではこのときのROWS関数の出力が0になるので結果的にうまくいきます。


 また、式のコピーなしでTRUE/FALSEを一括取得するにはどうするかですが、次のような式になります。

 C3セル

=BYROW(B3:B17,
LAMBDA(x,ROWS(UNIQUE(B3:B17,,TRUE))=ROWS(UNIQUE({B3:B17;x},,TRUE)))
)

 B3:B17(=x)を1セルずつ取り出しては元の範囲に加え、その都度上記1.~3.の判断を繰り返しています。LETではないのでB3:B17を全部xに置き換えてはいけません。
 なおこの場合、BYROWはMAPでもいいです。