いきなり答える備忘録

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

(Excel)文字列が半角英数字のみか判定する方法

 Excelで、文字列が半角英数字のみからなるかどうかを関数で判定する方法についてです。
 式は難しくありませんが判定できる文字数が制限されることが注意点です。

半角英数字のみか判定する方法

 次の画像では、B列に入力されている各種の文字列について「半角英数字のみからなる文字列かどうか」を判定しています(該当→TRUE、該当しない→FALSE)。

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

=ISNUMBER(DECIMAL(B3,36))

 DECIMAL関数を使い、文字列を36進数(半角数字の0~9、アルファベットのA~Z及びa~zを数とみなす)とみなして10進数に変換しています。文字列がそれらの文字だけからなる場合はDECIMAL関数が数値を返し、そうでない場合は#NUM!エラー(他の文字が含まれる場合)を返します。
 あとはISNUMBER関数によりTRUE/FALSEに変換することで、結果的に半角英数字だけからなるかどうかを判定しています。



 次の画像は上記の式をそのまま条件付き書式に使い、該当するセルに色を付けている例です。
 また、入力規則にも応用できますがこれは別途紹介したいと思います。
 判定だけなら今後導入されるPython in Excelで(正規表現マッチができるので)解決しそうですが、条件付き書式等についてはこうしたやり方が残るかもしれません。

半角英大文字と半角数字のみか判定する方法

 次の画像では「半角英大文字と半角数字のみからなる文字列かどうか」を判定しています。
 最初の例にも言えることですが「半角英大文字と半角数字の両方を含むか」ではないことに注意してください。

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

=AND(ISNUMBER(DECIMAL(B3,36)),EXACT(B3,UPPER(B3)))

 半角英数字のみであるという条件に「EXACT(B3,UPPER(B3))」という条件を加えています。つまりUPPER関数で大文字に変換したときに元の文字列と変わらないということを条件に加えています。

半角英小文字と半角数字のみか判定する方法

 次の画像では「半角英小文字と半角数字のみからなる文字列かどうか」を判定しています。
 これも「半角英小文字と半角数字の両方を含むか」ではないことに注意してください。

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

=AND(ISNUMBER(DECIMAL(B3,36)),EXACT(B3,LOWER(B3)))

 半角英数字のみであるという条件に「EXACT(B3,LOWER(B3))」という条件を加えています。つまりLOWER関数で小文字に変換したときに元の文字列と変わらないということを条件に加えています。

注意点

文字数が長すぎると誤ることとその対策

 上記のように比較的簡単な式で判定できるのがメリットですが、DECIMAL関数で評価できる文字数が限られるため文字数が長すぎると必ずFALSEが返されます
 次の画像は「半角英数字のみか判定する方法」の数式で「A」の字が続くセルを判定した例です。198文字ではTRUEと判定されるものの199字ではFALSEが返されます。


 


 文字列の長さをカウントして一定以上ならエラーか何かを返すというのも1つの方法ですが、万全を期すなら次のようにします。

 C3セル

=AND(ISNUMBER(DECIMAL(MID(B3,SEQUENCE(LEN(B3)),1),36)))

 1文字ずつ区切って判定を行いすべてTRUEになるかをAND関数で確認しています。これでセルに入れられる文字数の上限まで判定できるはずですが、SEQUENCEが使えないとダメで手軽さに欠けるのが痛いところです。

空白がある場合

 上記で紹介したいずれの式においても、空白セル(未入力)と空文字列(関数で「""」が返ったとき等の値)はTRUEと判定されます。
 次の画像は「半角英数字のみか判定する方法」の数式で空白セルと空文字列を判定した例です。

 


 これをFALSEと判定させる場合はIF関数を使って次のようにします。

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

=AND(B3<>"",ISNUMBER(DECIMAL(B3,36)))

 空白セルのみTRUEにしたい場合は「B3<>""」を「NOT(ISBLANK(B3))」とします。