• ベストアンサー

VBAで英数字入力チェックしたい。

いつもお世話になります。 いままで、ある項目の入力チェックを数字のみで 行っていたところ【IsNumeric】を英数字で行いたいのですが いくら調べても見当たりません・・・ 知っている方、どうかご指南ください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

IsAlphaが無いですね。 チェック用に、半角に統一して(StrConv)文字列を作り、 1字づつ、JISコードの65-90、97-122をエラーにするチェックを行い、上記作った文字列はチェック後は使い捨てる。 こういうルーチンを作るより他ないでしょう。 記号なども含めて考える。 ただ記号は十分検討が必要です。制限しすぎると、運用後にダウンとか、大騒ぎになる恐れをこめてます。

peko_12
質問者

お礼

ありがとうございます。 仕様が変わってしまい、また新たな問題が発生してしまいました・・ また行き詰ったらご教授ねがうやもしれません。 今回はとても勉強になりました!

その他の回答 (4)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#04です。補足ありがとうございました ですが想像力が貧困なので、何をどうすれば良いのか理解できませんでした おそらく事前チェックと事後チェックを一緒くたに書いているからだと思います。もし事前チェック方法は回答として求めていないなら、混乱しますから書かなくて結構です。 具体的な文字列(○×1Ab)を示して、このような結果(1AやError)を得たいというように再度説明をお願いできませんか

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

正規表現を用いたユーザ定義関数を2つ書きました。MyFunc1は文字列から半角英数字だけを取り出す関数で、MyFunc2は半角英数字以外がある時に「Error(文字列)」を返す関数です 質問のデータがどのように引き渡されるのか分かりませんので、とりあえずエクセルのユーザ定義関数として作りました。ワークシートに値を入力して関数の動作を確認してみてください。仕様に問題がなければロジックだけを流用できると思います。関数は  =MyFunc(A1) のようにして使います(A1はデータの入力されたセルアドレス) Function MyFunc1(ByVal trg As Range) As String '半角英数字を取り出す Dim RE, mchItems Dim strPattern As String Dim idx As Integer If trg <> "" Then   Set RE = CreateObject("VBScript.RegExp")   strPattern = "[0-9A-Z]"   With RE     .Pattern = strPattern     .IgnoreCase = True     .Global = True     Set mchItems = .Execute(StrConv(trg.Value, vbNarrow))     If mchItems.Count > 0 Then       For idx = 0 To mchItems.Count - 1         MyFunc1 = MyFunc1 & mchItems(idx).Value       Next idx     End If   End With   Set RE = Nothing End If End Function Function MyFunc2(ByVal trg As Range) As String '半角英数字以外があればエラーを返す Dim RE, mchItems Dim strPattern As String Dim idx As Integer If trg <> "" Then   Set RE = CreateObject("VBScript.RegExp")   strPattern = "[^0-9A-Z]"   With RE     .Pattern = strPattern     .IgnoreCase = True     .Global = True     Set mchItems = .Execute(StrConv(trg.Value, vbNarrow))     If mchItems.Count > 0 Then       MyFunc2 = "Error"     End If   End With   Set RE = Nothing End If End Function

peko_12
質問者

お礼

ありがとうございます。 とても参考になりました。 ぜひ取り入れたいのですが、仕様が変わってしまい、 また新たな問題が発生してしまいました。 フォームでの事前チェックで、全角入力を”必ず弾きたい”、かつ カタカナ・ひらがな入力を無効化する仕様に… 現在、KeyPress()で、大小A~Zと0~9のみ受け入れるようにしました。 が、キーボードで大小変換を押されてしますと(2バイト)は チッェク対象外になってしまうようです。 ご教授いただければよろしくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

>どうしてもチェックをいれないといけないようなのです。 imogasi さんの提案のように、ループで1文字ずつチェックするしか無いと思います。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

全角入力を”必ず弾きたい”のですか? StrConv(str, vbNarrow) で半角変換して受け入れるのは駄目ですか?

peko_12
質問者

お礼

ありがとうございます。参考にいただきました。 しかし仕様が変わってしまい、 また新たな問題が発生してしまいました。 フォームでの事前チェックで、全角入力を”必ず弾きたい”、かつ カタカナ・ひらがな入力を無効化する仕様に… 現在、KeyPress()で、大小A~Zと0~9のみ受け入れるようにしました。 が、キーボードで大小変換を押されてしますと(2バイト)は チッェク対象外になってしまうようです。 ご教授いただければよろしくお願いします。

peko_12
質問者

補足

その項目はフォームで、IME設定で半角英数字のみ入力 させています。(この状況ならチェックは要らないはずなのですが) どうしてもチェックをいれないといけないようなのです。 なので、全角入力はありえない状況での、wチェックということ になります。 入力前で半角英数字をはじいて、入力後チェックで半角英数字を 確認というような感じです。 もしよろしければご教授ください。

関連するQ&A