[[20140908223257]] 『半角英数字が入力されたかの判定』(ミッキー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『半角英数字が入力されたかの判定』(ミッキー)

とてもとても困っています!
みなさん、知恵をぜひ貸してください!!!

セルには必須項目として半角英数字4文字が入力されたら「0」、全角英数字や記号やひらがな、漢字が入力されたら、「1」を返したいです。

入力値  戻り値
お1A・・・「1」
1AC2・・・「0」
1110・・・「0」
A23b・・・「0」
CSCc・・・「0」
cい:1・・・「1」
丸12・・・「1」
A1CC・・・「1」

どうぞ、教えてください。
よろしくお願いします。

< 使用 アプリ:Excel2000、使用 OS:WindowsXP >


 マクロの例です。
 標準モジュールに下記を置き

 Function is4AN(r As Range)
    With CreateObject("VBScript.RegExp")
        .Pattern = "^\w{4}$"
        is4AN = IIf(.test(r.Value), 0, 1)
    End With
 End Function

 データがA1にあるとしたら、
 =is4AN(A1)
 で。
(Mook) 2014/09/08(月) 23:45

4文字限定でしょうか

=IF(AND(LEN(A1)=4,LEN(A1)=LENB(A1)),0,1)

こんなので判定できませんか?

(jun53) 2014/09/08(月) 23:51


 全角/半角の区別だけならよいと思いますが、記号や半角カタカナを1にもっていきたいと
 なるとちょっとつらいのでは?
(Mook) 2014/09/08(月) 23:56

Mookさん

ソースありがとううござます。
とても役に立ちそうです。

ただ、できるだけ仕様上の問題から、エクセルの関数で実現できる方法はありませんか?
すみませんが、教えてください。
たびたびの質問で申し訳ありません。

un53さん
ありがとうございます。
すみません、私のことば不足で。。。
4文字限定です。あと、入力は半角英数字のみとしたいので
この場合だと半角カナや半角記号でも「0」が返ってきてしまいます。
申し訳ありませんが、半角英数字のみの場合だけ「0」を返して欲しいです。
すみませんが、教えてください。
たびたびの質問で申し訳ありません。
(ミッキー) 2014/09/09(火) 00:11


4文字限定なら関数CODEのネストか組み合わせでできると思います

ですがゴメンナサイ、錦織さんの試合を見たいので
今床についたところです。
どなたかが回答してくれると思います。

(jun53) 2014/09/09(火) 00:22


Mookさん

やはり難しいですかね。。。。。
ありがとうございました。

jun53さん
ヒントありがとうございます。
っが、なかなかうまくいきません!!

試合終わってからでも良いのでぜひぜひ教えてください。
すみません。

どうか錦織さん勝ちますように!!
(ミッキー) 2014/09/09(火) 00:45


 >半角英数字4文字
 半角英数の定義は?

 > \w{4}
 これ A-Za-z0-9 と アンダースコア _ が対象ですが?
(seiya) 2014/09/09(火) 01:11

 マクロ案は没のようですが、ではこんなところで。
 .Pattern = "^[\da-zA-Z]{4}$"
(Mook) 2014/09/09(火) 01:31

seiyaさん
コメントありがとうございます。
半角英数字の定義は、半角数字0から9
半角英字AからZ、aからz のみです。

エクセル関数を使用して判断したいです、
すみませんが、お知恵をかしてください。

Mookさん
何度もありがとうございます。
さっそく試してみます。なんどもありがとうございます。

(ミッキ) 2014/09/09(火) 08:16


Mookさん同様、標準モジュールに、自作関数を用意する案を推します。
(例えばB1セルは =is4AN(A1) とする)

 Function is4AN(R As Range) As Long
    is4AN = 1

    If Len(R.Text) = 4 Then
        If Mid(R.Text, 1, 1) Like "[A-Za-z0-9]" And _
           Mid(R.Text, 2, 1) Like "[A-Za-z0-9]" And _
           Mid(R.Text, 3, 1) Like "[A-Za-z0-9]" And _
           Mid(R.Text, 4, 1) Like "[A-Za-z0-9]" Then
           is4AN = 0
        End If
    End If
End Function
(???) 2014/09/09(火) 08:53

 A-Za-z0-9だけ対象なら、無理やりこれじゃだめなん?
 A列が対象として
 B1=IF(LENB(A1)=4,SIGN(SUM(IF(ISERROR(FIND(MID($A1,COLUMN($A$1:$D$1),1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")),1,0))),1)
 ※再再修正 配列に入る前に4文字以外で振り分けたほうが効率が良かったので・・・
 11:14

 書き忘れ
 Ctrl+Shift+Enterで配列数式として確定してください。11:10

(稲葉) 2014/09/09(火) 09:28


もっと無理矢理案。

=IF(AND(LEN(A1)=4,ISNUMBER(FIND(MID(A1,1,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")),ISNUMBER(FIND(MID(A1,2,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")),ISNUMBER(FIND(MID(A1,3,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")),ISNUMBER(FIND(MID(A1,4,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"))),0,1)
(???) 2014/09/09(火) 09:34


 単純に

 =CheckLen(A1)

 Function CheckLen(txt As String) As Long
     If (Len(txt) <> 4) + (txt Like "*[!0-9A-Za-z]*") Then CheckLen = 1
 End Function
(seiya) 2014/09/09(火) 10:05

 jun53さんの案をそのまま(多分)
=IF(LEN(A1)<>4,1,IF(AND(
OR(AND(CODE(MID(A1,1,1))>=CODE("0"),CODE(MID(A1,1,1))<=CODE("9")),AND(CODE(MID(A1,1,1))>=CODE("A"),CODE(MID(A1,1,1))<=CODE("Z")),AND(CODE(MID(A1,1,1))>=CODE("a"),CODE(MID(A1,1,1))<=CODE("z"))),
OR(AND(CODE(MID(A1,2,1))>=CODE("0"),CODE(MID(A1,2,1))<=CODE("9")),AND(CODE(MID(A1,2,1))>=CODE("A"),CODE(MID(A1,2,1))<=CODE("Z")),AND(CODE(MID(A1,2,1))>=CODE("a"),CODE(MID(A1,2,1))<=CODE("z"))),
OR(AND(CODE(MID(A1,3,1))>=CODE("0"),CODE(MID(A1,3,1))<=CODE("9")),AND(CODE(MID(A1,3,1))>=CODE("A"),CODE(MID(A1,3,1))<=CODE("Z")),AND(CODE(MID(A1,3,1))>=CODE("a"),CODE(MID(A1,3,1))<=CODE("z"))),
OR(AND(CODE(MID(A1,4,1))>=CODE("0"),CODE(MID(A1,4,1))<=CODE("9")),AND(CODE(MID(A1,4,1))>=CODE("A"),CODE(MID(A1,4,1))<=CODE("Z")),AND(CODE(MID(A1,4,1))>=CODE("a"),CODE(MID(A1,4,1))<=CODE("z")))
),0,1))
(ご近所PG) 2014/09/09(火) 11:54

 (稲葉) 2014/09/09(火) 09:28 さんの回答と同じことですが

 =IF(AND(LEN(A1)=4,COUNT(INDEX(FIND(MID(A1,ROW($A$1:$A$4),1),"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),))=4),0,1)

 こちらでもいいかな
 =IF(AND(LEN(A1)=4,COUNT(INDEX(SEARCH(MID(A1,ROW($A$1:$A$4),1),"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),))=4),0,1)

(By) 2014/09/09(火) 12:44


 B1 =IF(A1="","",SIGN(SUM(LOOKUP(CODE(RIGHT("あ"&MID(A1,{1,2,3,4},1))),{0,48,58,65,91,97,123},{1,0,1,0,1,0,1,0,1}))))

 または

 B1 =IF(A1="","",SIGN(SUM(LOOKUP(CODE(UPPER(RIGHT("あ"&MID(A1,{1,2,3,4},1)))),{0,48,58,65,91},{1,0,1,0,1}))))

 下へコピー。
 
(GobGob) 2014/09/10(水) 08:09

 RIGHTいらないか・・・

 B1 =IF(A1="","",SIGN(SUM(LOOKUP(CODE(UPPER(MID(A1&"    ",{1,2,3,4},1))),{0,48,58,65,91},{1,0,1,0,1}))))
 
(GobGob) 2014/09/10(水) 08:14 → 8:16 修正

 お遊び案w

 B1 =(SUM(MMULT(ISERR(N(INDIRECT({"A",""}&TEXT(MID(A1,{1;2;3;4},1),"0;;!1")&{"",1})))*(LEN(A1)=LENB(A1)),{1;1}))<>4)*1
 
(GobGob) 2014/09/10(水) 09:44

 (GobGob) 2014/09/10(水) 08:14 → 8:16 修正 を利用して 

 こんな感じ

 =IF(LEN(A1)=4,OR(LOOKUP(CODE(UPPER(MID(A1,{1,2,3,4},1))),{0,48,58,65,91},{1,0,1,0,1}))*1,1)
(By) 2014/09/10(水) 15:11

 質問者じゃないのですが、よくわからないので教えてほしいことがあります。
 INDEXで配列を返す使い方は、ヘルプにある

 ・配列が複数行および複数列で構成され、 行番号または 列番号のどちらか一方しか
  指定されていない場合、INDEX では配列の中にある行または列全体の配列が返されます。

 のことだと思うのですが、引数にどのようなものを指定すれば配列となるのですか?

 書いてある通りだと
 =SUM(INDEX(IF(A1:A10>10,A1:A10),))
 でもできそうなのに、なぜ出来ないのか・・・
 それはIF関数がそもそも配列を返さない関数だから?

 と全然分かっていないので教えていただければ・・・
(稲葉) 2014/09/10(水) 17:04

 IFの論理式が配列の場合、TRUEとFALSEを判断しながら配列で返すからできないんじゃないかな?
 よくわかんないけど。

 論理式*範囲 みたいな場合は論理式の組み合わせで論理式自体が別の何かを判断してるわけではないからね。。。。

 勝手な憶測w。

 あと余談だけど、

 =SUM(IF(A1=1,B1:B10,C1:C10)) 

 コレは配列ではないんだよね・・・・。
 IFはあくまで「論理式」で配列か否か?となってるみたいだね。
 
(GobGob) 2014/09/10(水) 20:03

 Byさん。

 >=IF(LEN(A1)=4,OR(LOOKUP(CODE(UPPER(MID(A1,{1,2,3,4},1))),{0,48,58,65,91},{1,0,1,0,1}))*1,1)

 ・・・4文字で判断すれば確かにOKっすなぁ。
 一本とられました。w
 
(GobGob) 2014/09/10(水) 20:05

 > 書いてある通りだと
 > =SUM(INDEX(IF(A1:A10>10,A1:A10),))
 > でもできそうなのに、なぜ出来ないのか・・・
 > :
 > それはIF関数がそもそも配列を返さない関数だから?

 お説、ごもっともです。誰もが一度は抱く疑問です。

 なので、どの掲示板でも一度は誰かが質問し、
 すったもんだした挙句に、誰一人「そもそも論」が分かっていない
 と云うことが判明して終息します。

 Index関数が「書いてある通りだと」しても、
 下記(1)〜(5)は説明できても (6)を説明できる人はいません。
 ※(1)〜(4)も「そもそも論」で説明できるのか怪しいですけど、脇に置いておきます。

 行  _A_  ___B___  _C_  _D_
 1    1      1     6    6
 2    2      2           
 3    3      3           
 4       #VALUE!          

 (1) B1セル =SUM(A1:A3*1)
 (2) B2セル =SUM(A1:A3*1)
 (3) B3セル =SUM(A1:A3*1)
 (4) B4セル =SUM(A1:A3*1)

 (5) C1セル =SUM(INDEX(A1:A3*1,0)) 

 (6) D1セル =INDEX(SUM(A1:A3*1),0)

 結局、「関数の詳細な仕様」+「数式解析プログラムの仕様」が分からない限り
 ユーザーは「そもそも論議」なんて出来ないのではないか、と云うのが私の考えです。

(半平太) 2014/09/10(水) 21:12


 GobGobさん
 ありがとうございます。
 >=SUM(IF(A1=1,B1:B10,C1:C10)) 
 これ出来るようになれば便利ですよね!
 IF(A1=1,SUM(B1:B10),SUM(C1:C10))ってのが簡単に書けそうなのに。
 IFARRAYみたいな関数実装してくれればいいのに・・・

 半平太さん
 >すったもんだした挙句に、誰一人「そもそも論」が分かっていない
 >・・
 >結局、「関数の詳細な仕様」+「数式解析プログラムの仕様」が分からない限り
 >ユーザーは「そもそも論議」なんて出来ないのではないか、と云うのが私の考えです。
 LOOKUPで最後の値を取るで悩んだとき、つまり便利なときは「そういう仕様なんだ」で済んで
 出来ないとき不便なときは、なんで出来ないんだって思っちゃいます。

 そもそも「そういう仕様なんだ」で納得するしかないってことですよね・・・。

 スレ違いにお付き合い頂きありがとうございました。

 ミッキーさん、おじゃま致しました。   

(稲葉) 2014/09/11(木) 08:42


 稲葉さん

 GobGobさんの書き込みは、私は全然理解できなかったのですけど、
 これはどう云う意味ですか?(4行程度のサンプルを示していただけるとありがたいです)
  ↓
 > >=SUM(IF(A1=1,B1:B10,C1:C10)) 
 > これ出来るようになれば便利ですよね!
 > IF(A1=1,SUM(B1:B10),SUM(C1:C10))ってのが簡単に書けそうなのに。
 > IFARRAYみたいな関数実装してくれればいいのに・・・

(半平太) 2014/09/11(木) 10:18


 半平太さん
 私がおかしな例を出していました。
 というか理解してませんでした。
 >> IF(A1=1,SUM(B1:B10),SUM(C1:C10))ってのが簡単に書けそうなのに。
 GobGobさんが言いたかったことは、
 「これは配列関数じゃなくても配列が返るのに」または
 「IF関数は第一引数を配列として入力しない限り、配列として認識しない」を

 「IF関数はそもそも配列が返らない」と勘違いして捉えていました。

 早とちりですみません。

(稲葉) 2014/09/11(木) 12:11


 説明難しいね。

    A   B   C
 1      1   2
 2  1   1   2
 3      1   2
 4  1   1   2
 5      1   2

 =SUM(IF(A1:A5=1,B1:B5,C1:C5))

 A1<>1 → 2
 A1= 1 → 1
 A1<>1 → 2
 A1= 1 → 1
 A1<>1 → 2   結果 8  ・・・ コレを配列処理(第一引数の結果を見ながら配列処理)

 =SUM(INDEX((A1:A5=1)*(B1:B5)+(A1:A5<>1)*(C1:C5),))

 ・・・ それぞれの配列を処理。 結果 8

 なんかね。IFだと「確認」ってか、1ステップ多いんだよね。

 INDEXは配列データを処理できるとして、判断しながらの配列をデータにするってのに
 なんか意味ありそうかな?と。

 そんな関係もあるのかもって憶測ですけど。

 まぁ、造ったもんしかわからんのは当然として
 (よー考えたらすべての関数を配列処理できるようにしても良いわけで。。。やっぱり理由はあるんだろうね)

 いろいろ憶測で考えてみるのも楽しいもんです。
 それを鵜呑みにされると困るけどw。(なので「憶測」とはちゃんと謳ってますわ)
 
(GobGob) 2014/09/11(木) 13:14

 半平太さんの (6) に関しては

 =SUM(INDEX(・・・)) は SUMの結果 
 =INDEX(SUM(・・・),0) はINDEXの結果

 ・・・当たり前ですがw。 
 けど、INDEXって結果は「配列」で返るんだよね。

 SUM(INDEX  → 6  SUMの結果
 INDEX(SUM  → {6} データ数 1×1の「配列」で返る。

 やっぱり、なんかあるね。コレ。

 INDEXの配列方式って 第一引数が「配列」って謳われてるんで、きちんと配列処理された結果が返るんじゃないかな?
 (ヘルプの表現がなんか物語ってるなっていつも感じてますわ)

 んで、今回はINDEXの引数処理でSUMがきちんと計算されてそれをINDEXで配列データとして返してる。
 って感じますわ。

 だとしたら、IF(  ・・ はなぜ? って感じなんだけど、 IFの配列は前段で話したワンクッション的な
 処理するんで

 もしかしたらIF関数って 

 IF配列処理後 → INDEX処理をする。

 でなく

 INDEX(IF(・・・  を配列分繰り返す。
 見たいな感じかもしれんなーって感じます。(ネストっぽい感じ?)

 まぁ、すべて「憶測」ですけどねw。

 あ、けど じゃあ SUM(IF を配列分繰り返したら SUMできないか・・・
 ん〜。 闇の中w。
 
(GobGob) 2014/09/11(木) 13:37 → 13:41 加筆

 稲葉さん

 ますます分からなくなっちゃいました。

 いままでよくある質問を簡単に書きますと
 ーーーーーーーーーーーーーーーーーーーー
  行  _A_  _B_
   1   11   37  B1セル =SUM(IF(A1:A3>10,A1:A3))
   2    7   30   B2セル =SUM(IF({TRUE;FALSE;TRUE},A1:A3))
   3   19   37   B3セル =SUM(IF(INDEX(A1:A3>10,0),A1:A3))
   4        30   B4セル =SUM(IF(MMULT(N(A1:A3>10),1),A1:A3))

  B1の式は37が返る。何故なら第一引数のA1セルのみ10超かどうかだけで真偽判断されてしまったから。

   B2の式は30と正しく出る。何故なら第一引数が配列定数だから。

  なら、第一引数を配列にすれば30が出るかも知れない。
  そう云えば、Index()は配列を返す関数だな。それなら、
  B3の式で30が出るハズ・・なんだけど37になっちゃった。何故か?
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 前レスで書いた通り、仕様の詳細が分からないので誰も答えられない。
 ヘルプが嘘をついているか、説明不足なのか。

 ただ、INDEX関数は神通力がなかったですけど、第一引数を配列にすると云うアイデアは意味があります。
 経験でFrequency、Lookup、Mmult関数などを上手く利用すれば出来ることが分かっています。(例:B4セル)
(半平太) 2014/09/11(木) 14:09

 半平太さん GobGobさん
 >前レスで書いた通り、仕様の詳細が分からないので誰も答えられない。
 >それを鵜呑みにされると困るけどw。(なので「憶測」とはちゃんと謳ってますわ)
 はい、すみません・・・

 INDEXにこだわらず、まずはもっと経験を積んで「使い方」を覚えるように致します。

 申し訳ついでに、質問です。
 同じ結果になる場合、INDEXを配列を返す関数として使用するのと、単純に配列数式とするのとでは
 INDEXを使った場合どのような利点があるのでしょう?

(稲葉) 2014/09/11(木) 15:41


 INDEXを使うとCTRL+SHIFT+ENTERしないで済む。。。。 位っすね。当方が使うのは。

 けど、Bookをみんなと共有するとかの場合、配列数式をなんかの間違いで
 編集→Enterして 「あ〜計算されへん!」 見たいな感じになるのがいやなんで
 なるべく Enterで終わるようにしてます。(当方)。

 ・・・けど、ホンネは作業列バリバリで配列数式使わない方向でやってますけどねw。
 
(GobGob) 2014/09/11(木) 15:47

 利点
  数式を入れ直した時、CSE操作を忘れたりする懸念がなくなる。(エラーになれば気づくが、そうなるとは限らない)
  質問者が初心者でCSE入力を知らず「うまく行きません」なんて言い出す面倒が避けられる(Q&A専用ニーズ)

 欠点
  INDEXを挟む分、冗長である。
   (見た目、何の意味があるか分からない。当然です、CSE入力を避けるためだけに存在しているんですから)

(半平太) 2014/09/11(木) 16:10


 お二方ともありがとうございます。
 配列数式入力を明示的に配列で計算しなさいって関数で括ってあげるような形に
 なってくれればいいですねぇ。
 数式を{}で括るでもいいですけど、そうすればCTRL+SHIFT+ENTERなんて説明せず
 「このまま貼り付けぃ」って言えるんですけどね!

 揮発性関数しかり、多数のセルに入力する場合は作業列が一番ですよね。

 長々とありがとうございました。
(稲葉) 2014/09/11(木) 16:24

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.