Excelの小問題

  • [記事公開]2022.08.31
  • Excel

Twitterで@excelvba_diaryさんが呟いておられたExcelの小問題がおもしろかったのでご紹介します。

問題

A1, A2, A3, A4, A5 がすべてユニークならTrue、一組でも同じものがあればFalseを返すExcel式で最も短い式を考えてください。それぞれのセルには数値または文字列が入ります。類似の質問が既に出ているかもしれません。一応自身の答えはありますが、さらに短くできると想定しています。

午後6:58 · 2022年8月25日 @excelvba_diary

私の考えた答え

私の考えた答えは、こうです。

=ROWS(UNIQUE(A1:A5))=5

しかし、これでは「abc」と「ABC」とが同一と判断されてしまい、正しい判定をしません。

みんなの答え

@excelvba_diaryさんが皆さんの答えを紹介していましたので、こちらに列挙します。

=SUM((A1:A5=TRANSPOSE(A1:A5))+0)=5
=ROWS(UNIQUE(A1:A5))=5
=COUNTA(UNIQUE(A1:A5))=5
{=AND(MATCH(A1:A5,A1:A5,0)=ROW(A1:A5))}
{=AND(COUNTIF(A1:A5,A1:A5)=1)}

午後4:49 · 2022年8月26日 @excelvba_diary

いろいろ考え方があるものですね!おもしろいです。

ただ、いずれも大文字小文字を区別しないのがネックです。

やはりVBAでやるしかないのでしょうか?

VBAを考えてみた

VBAだとどうやるかなーと思い、作ってみました。

Public Function UNIQ(Rng As Range) As Boolean
    Dim ii As Long
    Dim Cnt As Long
    Dim Dic As Object
    Dim vBuf As Variant
    
    Cnt = Rng.Rows.Count
    Set Dic = CreateObject("Scripting.Dictionary")
    
    For ii = 1 To Cnt
        vBuf = Rng(ii, 1).Value
        If Not Dic.Exists(vBuf) Then
            Dic.Add vBuf, ii
        End If
    Next ii
    
    If Dic.Count = Cnt Then
        UNIQ = True
    Else
        UNIQ = False
    End If
    
    Set Dic = Nothing
End Function

これで大文字と小文字は判別できるはずです。

実験結果↓

セルI1にユーザ定義関数のUNIQ関数が入っています。

B列に入っているのが数式だけでなんとか判定しようとしているものです。

I列に入っているUNIQ関数は、大文字と小文字の判定を正しくすることができました。

まとめ

今回の問題の発端は、複数のExcelのバージョンを抱えている方の悩みのようです。

スピルは365では使えますが、2016以前では使えませんので。

VBAでやれば簡単ですが、セキュリティが厳しくマクロの使用が許可されない環境下では使えません。

私は365を使っていますが、現場ではいまだに2016以前を使っているところも多いようです。

そういうシビアな環境下では、こういういろいろな数式を駆使して対応する必要があるのでしょうね。

何かの参考になれば幸いです。

ここまでお読みいただき、ありがとうございます。