- ベストアンサー
エクセル 半角英数6文字以上 8文字の入力制限
エクセルのあるセル内に入力させた文字のチェックにあたり で半角英数(0,1,2,3,4,5,6,7,8,9)と(a,b,c,d,e,f,g,h,i,j,k,l,n,m,o,p,q,r,s,t,u,v,w,x,y,z) (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,) の組み合わせによる6文字以上8文字以内、さらに数字のみの 組み合わせを禁止したチェックを行ないたいのです。 現状 LENB関数で6未満 LENB関数で9以上をエラー ISNUMBER関数でTRUEの場合エラーとしているのですが 半角カタカナや記号に対してチェックをかける関数が 分かりません。 入力されてくるセルに対するチェックの関数は 半角カタカナチェックの関数式 記号チェックの関数式と別に分けていただいても構いませんので アドバイスいただけましたら幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 今回はVBAを使わないでチェックを行なう方法を考えていたものですから... 了解です。では、関数でやってみます。 ・テキストか調べる =IF(ISTEXT(A1),"文字列です","文字列以外です") ・全角文字があるか調べる =IF(LEN(A1)=LENB(ASC(A1)),"全角なし","全角あり") 以上2つを連結させます。 =IF(AND(ISTEXT(A1),LEN(A1)=LENB(ASC(A1))),"OK","NG") これで、「全角文字が含まれない文字列か?」を判定できます。 ・記号や数字があるか調べる =IF(ISERROR(FIND({"+","-",";"},A1)),"記号なし","記号あり") FIND 関数の第 1 引数に { } で判定させるリストを渡します。 上記例だと記号 + - ; だけです。したがって、要は禁止文字をリスト化 すれば良いのですが、半角カナを除いても、 =ISERROR(FIND({0,1,2,3,4,5,6,7,8,9,"!","""","#","$","%","&","'","(",")","-","=","^","~","\","|","@","`","[","{",";","+",":","*","]","<",",",">",".","/","?","_"},A1)) で数字や記号があるかをやっと調べられます。半角カナも含めるなら、 リストはさらに増えますね、、、 というか、面倒なので半角カナ対応のためのリスト追加はご自分で お願いします。 これらを組あわせれば、ご希望の入力チェックは可能だと思いますが、 確認はしてません。 私には関数による解は、こんな方法しか思いつきません。そもそも、関数は ループ処理ができないし、Excel 既存の関数には、「配列内の文字を含む」 を調べるものがないのですから、こんな感じで複雑を極める数式になります。 VBA がなぜダメなのか良くわかりませんが、この数式のメンテナンスは 容易ではないと思いますよ。。。むしろ、VBA の方がシンプルです。 頑張って下さい。 私は関数が苦手なので、もっと良い回答があるかもしれません。 すみません、あまりお力になれず。
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
No1さんのをお借りして ベタな方法ですが 標準モジュールにこんな風では? A1にチェックしたいのがあるとしてB1に =pwdchk(A1) Function PWDchk(ChkString As Variant) As String '数値0~9はCODE48~57 'A~ZはCODE65~90 'a~zはCODE97~122 Dim i As Integer If Len(ChkString) < 6 Or Len(ChkString) > 8 Then PWDchk = "文字数違反。" End If If IsNumeric(ChkString) Then PWDchk = PWDchk & "数字だけじゃ却下。" End If For i = 1 To Len(ChkString) Select Case Asc(Mid(ChkString, i, 1)) Case 48 To 57, 65 To 90, 97 To 122 Case Else PWDchk = PWDchk & "文字種違反。" Exit For End Select Next End Function
お礼
回答有難うございました。今回はVBAを使わない方法で作らないといけなかったので、nicotinism様の回答は今後の参考資料として勉強させていただきます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 VBA でユーザー定義関数を作った方が早いと思いますが、、ダメですかね? ご参考までに。 1. VBE で標準モジュールを挿入し、下部のソースコードをコピペ 2. VBE を閉じ、ワークシート上で次の数式を入力 =DATACHECK(A1,"^[0-9A-z]{6,8}$") これで、A1 セルについて判定できます。第 2 引数の”パターン”は正規表現 で渡します。入力チェックのパターンは柔軟に対応できますよ。例えば、 半角アルファベットのみ → "^[A-z]{1,}$" 半角数字のみ → "^[0-9]{1,}$" 書式 ID-000000 → "^ID-[0-9]{6}$" とか。 正規表現をご存知ない場合は、下記 URL が参考になります。わかり易いです。 私はちんぷんかんぷんだった(今もですが)ので、ここで勉強しました。 http://www.mnet.ne.jp/~nakama/ 以下はソースコードです。 ' 正規表現でわたされたパターンと一致すれば TRUE を返す Function DATACHECK( _ ByRef データ As Variant, _ ByRef パターン As Variant) As Boolean Dim Reg As Object Set Reg = CreateObject("VBScript.RegExp") With Reg .Pattern = パターン .IgnoreCase = False .Global = True DATACHECK = .Test(データ) End With Set Reg = Nothing End Function
お礼
今回はVBAを使わないでチェックを行なう方法を考えていたものですから、残念ながらご回答いただいたにもかかわらず、利用することができません。ただ正規表現につきましては重点課題でしたので、参考URLを教えていただきましたことに感謝しております。VBAのソースコードも有難うございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
きっとほかにいい方法があるのでしょうが・・・・。 文字コードでチェックしたらいかがでしょうか? 数値0~9はCODE48~57 A~ZはCODE65~90 a~zはCODE97~122 CODEは =CODEで求められます。(一個ずつ調べるのは大変そうですが・・・)
お礼
CODE関数の詳細をお教えくださいまして有難うございました。入力される値を分割してコードチェックをかけるような方法ができそうですね。
お礼
再度ご回答有難うございました。一人目の回答の方を参考に以下のように作ってみました。A1に文字列が記入された場合 A2 6桁以下チェック =IF(LENB(A1)<6,1,0) A3 8桁以上チェック =IF(LENB(A1)>8,2,0) A4 数字のみチェック =IF(ISNUMBER(A1)=TRUE,3,0) A5 A1一文字目抜き出し =MID(A1,1,1) A6 A1二文字目抜き出し =MID(A1,2,1) 以下八文字まで同じ B5 A5コード番号取り出し =IF(A5="",0,CODE(A5)) B6 A6コード番号取り出し =IF(A6="",0,CODE(A6)) 以下八文字まで同じ C5 B5コード番号チェック =IF(B5="",0,IF(OR(AND(B5>=48,B5<=57),AND(B5>=65,B5<=90),AND(B5>=97,B5<=122)),0,1)) C6 B6コード番号チェック =IF(B6="",0,IF(OR(AND(B6>=48,B6<=57),AND(B6>=65,B6<=90),AND(B6>=97,B6<=122)),0,1)) 以下八文字目まで同じ A13 C5~C12コード番号チェックの合計 =IF(SUM(C5:C12)>0,4,0) A14 A2,A3,A4,A13のチェックで 全てが0だった場合に正しい処理を行なうようにして1~4のいずれかの数字がたった場合はそれに見合ったエラー表示を行なうように作りました。(ここではエラー表示の式は示しておりません) 私の場合関数が長くなりすぎるとパニックになってしまいますもので不細工ではありますが式を分け分けしながら作りました。 全てお知恵をお借りしてできたものでありまして 親身にお答えいただいたKenKen_SP様はじめ皆様にお礼申し上げます。 有難うございました。