テキストボックスで数字以外を入力不可能にするには?

Question 34.2   Previous Next
はじめまして。とっても初心者的な質問で申し訳無いのですが、
テキストボックスから数値を入力するとき、プロパティー設定で数字以外の文字(英字/平仮名/漢字/etc.)を入力出来ない様にする方法を教えてください。
宜しくお願い致します。
Answer   Copyright (C) 2000.11.20 永井善王
あなたが例示された数字以外の文字を、2つに分けて考える必要があると思います。
第1: IME(日本語入力モード)を OFFにした状態で入力する英字など
第2: IMEを ONにした状態で入力する平仮名、漢字など

テキストボックスのプロパティに IME Mode があるので、ひらがなや漢字などの入力を禁止することは可能です。しかし、IMEを OFFにした状態で英字や記号の入力を禁止するプロパティは、ないのではないかと思います。

テキストボックスのプロパティ 1. IME Modeプロパティの設定方法

テキストボックスの IMEModeプロパティを、右図のように
『 3 - fmIMEModeDisable 』に設定します。このモードにするとユーザーが、キー操作では IME をONにすることができなくなります。

この方法ではユーザーにいじられる危険性があるので避けたい場合は、マクロで設定することも可能です。ここでは解説しませんが、必要でしたら [Macro]-[コントロール]-[コンボボックス]の「IMEモードを設定する」 を参考にしてください。
これによりユーザーは、必ず IMEを OFFにした状態で入力作業を行うことになるので、テキストボックスに入力される値が、いわゆる半角の英数字と記号などに限定されます。

上記の前提の下で、数字以外を入力不可能にする方法を考えてみましょう。Excel97以上ではイベントの利用が考えられます。短いマクロを組んでみます。

2. テキストボックスのキープレスイベント
このイベントは、ユーザーがテキストボックスで入力中に、キーボードのキーを押下すると発生します。そして、どんな値が入力されたかを返り値として ASCIIコードで返してくれます。よって、テキストボックスに 1文字入力されるたびに、返り値をマクロでチェックすることが可能です。
例えば、次のようなイベントマクロをテキストボックスのコード画面で作成します。
'==============================================================================
 ◆テキストボックスのコード◆
'------------------------------------------------------------------------------
Private Sub TextBox1_KeyPress(ByVal 入力値 As MSForms.ReturnInteger)
                                            'キープレスイベント
    If 入力値 < 48 Or 入力値 > 57 Then      '入力値が 0より小さいか 9より大きければ
        入力値 = 0                          '入力値を 0(無効)にする
    End If
End Sub
'------------------------------------------------------------------------------
数字の 0 は ASCIIコードでは 48、9 は 57 となります。

school 3. テキストボックスのチェンジイベント
このイベントは、テキストボックスの値が変ると発生します。テキストボックスに入力された値の最右端が数字かどうかをチェックして、数字でなければ消してしまいます。テキストボックスのコード画面で作成します。
'------------------------------------------------------------------------------
Private Sub TextBox1_Change()               'チェンジイベント
    If Len(TextBox1.Text) <> 0 Then         '入力値の長さが 0でなければ
        If IsNumeric(Right(TextBox1.Text, 1)) <> True Then
                                            '入力値の最右端が数字でなければ
          TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
                                            '最右端以外を入力値に
        End If
    End If
End Sub
'==============================================================================
本題には関係ありませんが、このイベントプロシージャには大きな特徴があります。
4行目のコードは最右端の1字しか消せませんが、これが実行されるとテキストボックスの値が変ります。そうすると再びチェンジイベントが発生するので、変更後の最右端の1字が数字でなければ、その1字も消されます。この動作を数字が現れるまで何度でも繰り返すので、IME Modeプロパティを設定しない環境下で IMEをオンにして日本語などを入力してしまった場合でも、数字以外を消すことが可能です。
しかし、その場合は全角数字は入力できてしまいますので、対策が必要になります。

2.と 3.のマクロは、どちらか好きなほうを 1つだけ使います。

Excel VBA Macro