文字列操作の例(商品コードに英字が含まれているか)

質問は「英字が含まれているか」だったのですが....
そもそもコード設計の問題ですが....   こんな質問をしてくる場面は同じ「商品コード」であっても桁数もバラバラ、数字だけだったり英字が含まれていたりで、何かその文字列中の文字に「意味」があるようなケースだろうと思います。
もしかしたら「数字だけで構成されているか」ではないのか、とか「商品コード等ならマスタで存在チェックすれば済む」とかご意見もあろうかと思います。 まあ、場面はさておき、「英字が含まれているか」などを判定してみます。
何種類かの方法を提示していますが、実情にあった方法を考えて下さい。

サンプルを用意しました。

字類チェックサンプル
(画像をクリックすると、このページのサンプルがダウンロードできます)
このようなサンプルを用意しました。
A列に「商品コード」があり、BF列でその評価を行なっています。
以降に各評価列の目的や数式説明を行ないます。

[B列]英字が含まれているか①

半角英字が1文字でも含まれていれば「○」とする例です。簡易的な方法です。

=IF(AND(EXACT(UPPER($A2),$A2),EXACT(LOWER($A2),$A2)),"×","○")
半角英字は「大文字変換(UPPER関数)」「小文字変換(LOWER関数)」ができるので、 両方それぞれを変換させた文字列と元の文字列が同じなら「半角英字は含まれない」と判断できるという方法です。
一致を判断する「EXACT関数」は大文字/小文字を含めての完全一致かどうかが判定できます。

[C列]英字が含まれているか②

半角英字が1文字でも含まれていれば「○」とする例です。質問を字面の通り「まじめ」に取り組んだ方法です。

=IF(SUM(COUNTIF($A2,"*A*")
       ,COUNTIF($A2,"*B*")
       ,COUNTIF($A2,"*C*")
       ,COUNTIF($A2,"*D*")
       ,COUNTIF($A2,"*E*")
       ,COUNTIF($A2,"*F*")
       ,COUNTIF($A2,"*G*")
       ,COUNTIF($A2,"*H*")
       ,COUNTIF($A2,"*I*")
       ,COUNTIF($A2,"*J*")
       ,COUNTIF($A2,"*K*")
       ,COUNTIF($A2,"*L*")
       ,COUNTIF($A2,"*M*")
       ,COUNTIF($A2,"*N*")
       ,COUNTIF($A2,"*O*")
       ,COUNTIF($A2,"*P*")
       ,COUNTIF($A2,"*Q*")
       ,COUNTIF($A2,"*R*")
       ,COUNTIF($A2,"*S*")
       ,COUNTIF($A2,"*T*")
       ,COUNTIF($A2,"*U*")
       ,COUNTIF($A2,"*V*")
       ,COUNTIF($A2,"*W*")
       ,COUNTIF($A2,"*X*")
       ,COUNTIF($A2,"*Y*")
       ,COUNTIF($A2,"*Z*"))>0,"○","×")
半角英字26文字種を1文字ずつ判定する方法ですが、「COUNTIF関数」をワイルドカードで文字検索させています。
COUNTIF関数」の第1引数は「検索するセル範囲」であり、結果は「該当するセルの個数」で返されるものですが、 ここでは単一セルで行なうため「1」か「0」しか返りません。
これを26文字種についてそれぞれ行ない、戻り値の合計を「SUM関数」で集計させています。
結果がゼロでなければ「半角英字は含まれる」と判断できるという方法です。
なお、「COUNTIF関数」では半角英字の大文字/小文字は区別されないので、大文字のみで検査しています。

[D列]英字だけで構成されているか

「英字が含まれているか」ではなく「英字だけで構成されているか」なので難しくなりました。

=IF(SUM((LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"A","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"B","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"C","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"D","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"E","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"F","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"G","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"H","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"I","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"J","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"K","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"L","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"M","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"N","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"O","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"P","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"Q","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"R","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"S","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"T","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"U","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"V","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"W","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"X","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"Y","")))
       ,(LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"Z",""))))=LEN($A2),"○","×")
なぜ「難しい」かというと、Excelには「文字列中に特定文字が何個あるか」を単純に算出する適当な関数がないのです。
やり方としては、半角英字26文字種を1文字ずつ判定する方法なのですが、各半角英字を文字列中から一旦「無いもの」として変換し、 その変換後の文字列長と元の文字列長の「差」を求めれば該当の半角英字の文字数になる、という方法を採ります。
これを26文字種全てについて行ない、結果の文字数の合計が元々の文字数と一致すれば「半角英字のみ」と判断できるわけです。
なお、半角英字は大文字/小文字の問題があるので「大文字変換(UPPER関数)」で大文字にした上で判定します。



半角英字26文字種の1文字分の判定は、

LEN($A2)-LEN(SUBSTITUTE(UPPER($A2),"A",""))
となります。
まず、「LEN($A2)」は元の文字列の文字数です。
SUBSTITUTE(UPPER($A2),"A","")」が「大文字変換した元の文字列の中の"A"""(空文字)に置き換える」という動作になります。
空文字は文字数にカウントされないので、"A"の分が差し引かれたカウントになり、それを元の文字列長から差し引くので実質"A"の文字数になるわけです。 (引数の範囲区別を明確にするため、この単位でカッコを付けています)



実際問題として、「LEN($A2)」はこの数式の中で27箇所で発生しているわけで「無駄な動き」にも見えます。
現在のPCでは何の問題もなく動作しているようですが、この分を一旦使わない列に収容して、この数式ではそのセルの参照にする方が効率的なのかも知れません。

[E列]数字だけで構成されているか①

簡易的な方法として「数字だけの文字列なら数値に変換できる」ということを利用する方法です。完全な方法ではありません。

=IF(ISERROR(VALUE($A2)),"×","○")
対象文字列を「VALUE関数」で数値変換し、失敗しなければ「数字だけの文字列」だと判断する方法です。 「失敗」の判定は「ISERROR関数」で行ないます。 (桁数オーバーは指数処理されるのか30桁位でもエラーにはなりません)
但し、サンプル画面の15行目のように符号、小数点、カンマ(位取り)が適切な位置にあると、 「○」になってしまうという問題点があります。

[F列]数字だけで構成されているか②

これはD列の「英字だけで構成されているか」と同じ考え方の方法です。

=IF(SUM((LEN($A2)-LEN(SUBSTITUTE($A2,"0","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"1","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"2","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"3","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"4","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"5","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"6","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"7","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"8","")))
       ,(LEN($A2)-LEN(SUBSTITUTE($A2,"9",""))))=LEN($A2),"○","×")
数字なので10種類となり、大文字/小文字の問題がなくなるので、D列より簡単な数式になりました。
説明はD列と同じになるので割愛します。