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
午後4:49 · 2022年8月26日 @excelvba_diary
=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)}
いろいろ考え方があるものですね!おもしろいです。
ただ、いずれも大文字小文字を区別しないのがネックです。
やはり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
これで大文字と小文字は判別できるはずです。
実験結果↓
B列に入っているのが数式だけでなんとか判定しようとしているものです。
I列に入っているUNIQ関数は、大文字と小文字の判定を正しくすることができました。
まとめ
今回の問題の発端は、複数のExcelのバージョンを抱えている方の悩みのようです。
スピルは365では使えますが、2016以前では使えませんので。
VBAでやれば簡単ですが、セキュリティが厳しくマクロの使用が許可されない環境下では使えません。
私は365を使っていますが、現場ではいまだに2016以前を使っているところも多いようです。
そういうシビアな環境下では、こういういろいろな数式を駆使して対応する必要があるのでしょうね。
何かの参考になれば幸いです。
ここまでお読みいただき、ありがとうございます。
-
前の記事
管轄社労士の看板を掛けに行く 2022.08.30
-
次の記事
監督指導による賃金不払残業の是正結果 2022.09.01