【Excel VBA】UserFormのTextBoxを数字のみ入力可能にする方法|KeyPress・IsNumeric・貼り付け対策

みなさんこんにちは。

Excel VBAでUserFormを作成していると、TextBoxに数字だけを入力させたい場面があるかと思います。

例えば、数量や金額、管理番号などを入力するTextBoxに文字が入力されてしまうと、その後の計算や処理でエラーになる可能性があります。

今回は、UserFormのTextBoxを数字のみ入力可能にする方法について、KeyPressイベントとIsNumeric関数を使用してご紹介したいと思います。

あわせて、コピー&ペースト時の注意点や、小数点・マイナス値を入力できるようにする方法についてもご紹介します。


この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • Excel VBAでUserFormを作成している人
  • TextBoxに数字だけを入力させたい人
  • 文字や記号を入力できないようにしたい人
  • コピー&ペーストによる不正な入力もチェックしたい人

といったところでしょうか。


UserFormに関する過去の記事

UserFormの基本的な表示方法やComboBoxの連動については、過去の記事でもご紹介しておりますのでそちらもどうぞ。

https://epsilon-delta-blog.com/vba-userform-combobox-cascade

今回やりたいこと

今回はUserFormにTextBoxを1つ配置し、キーボードから入力する場合は「0~9」の数字だけを入力できるようにします。

BackSpaceについては、入力した数字を削除するために使用できるようにします。

Excel VBAのUserFormに数字入力用のTextBoxを配置した画面

KeyPressで数字だけ入力可能にする

TextBoxのKeyPressイベントに、以下のコードを記述します。

'========================================================
' TextBox1に入力できる文字を制限する処理
' 数字(0~9)とBackSpaceだけを許可し、
' それ以外の文字は入力できないようにする
'========================================================
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    '入力されたキーのASCIIコードを判定する
    Select Case KeyAscii

        '0~9の数字
        'ASCIIコード48~57が数字の0~9に該当する
        Case 48 To 57

            '数字の場合は何もせず、そのまま入力を許可する


        'BackSpace
        'ASCIIコード8がBackSpaceに該当する
        Case 8

            '入力した数字を削除できるようにするため、
            'BackSpaceはそのまま使用可能にする


        '数字とBackSpace以外が入力された場合
        Case Else

            'KeyAsciiを0にすることで、
            '入力されたキーを無効化する
            KeyAscii = 0

    End Select

End Sub


'========================================================
' UserFormを起動した時に実行される処理
' TextBox1で日本語入力が行われないように
' IMEを無効化する
'========================================================
Private Sub UserForm_Initialize()

    'TextBox1のIMEを無効化する
    '日本語入力モードになっていても、
    'TextBox1ではIMEを使用できないようにする
    Me.TextBox1.IMEMode = fmIMEModeDisable

End Sub

ASCIIコードの48~57は「0~9」の数字になります。

また、BackSpaceのキーコードは8になりますので、数字とBackSpace以外が入力された場合は KeyAscii = 0 として入力を無効にしています。

実行すると、数字は入力できますが、アルファベットや日本語などは入力できなくなります。

Excel VBAのUserFormでTextBoxに数字だけを入力できるようにした画面

コピー&ペースト対策としてIsNumericでもチェックする

KeyPressイベントはキーボードからの入力を制御する際に便利ですが、右クリックなどから文字列を貼り付ける場合も考えられます。

そのため、TextBoxの入力が確定する前にIsNumeric関数を使用してもう一度確認しておくと安心です。

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

    If Me.TextBox1.Value = "" Then
        Exit Sub
    End If

    If Not IsNumeric(Me.TextBox1.Value) Then

        MsgBox "数字のみ入力してください。", vbExclamation
        Cancel = True

    End If

End Sub

IsNumeric関数は、指定した値を数値として評価できる場合にTrueを返します。

そのため、数字以外の内容がTextBoxへ貼り付けられていた場合はメッセージを表示し、そのまま次の項目へ移動しないようにしています。

Excel VBAのUserFormで数字以外を貼り付けた際に警告メッセージを表示した画面

KeyPressとIsNumericを組み合わせる理由

方法役割
KeyPressキーボードから不要な文字を入力させない
IsNumericTextBoxに入っている値が最終的に数値か確認する

入力時と確定時の2段階で確認することで、より安全に数値入力を扱うことができます。

小数点を入力できるようにする場合

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Select Case KeyAscii

        Case 48 To 57, 8

        Case 46
            If InStr(Me.TextBox1.Text, ".") > 0 Then
                KeyAscii = 0
            End If

        Case Else
            KeyAscii = 0

    End Select

End Sub

「.」のキーコードは46になります。すでに小数点が入力されている場合は、2つ目の小数点を入力できないようにしています。

マイナス値も入力できるようにする場合

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Select Case KeyAscii

        Case 48 To 57, 8

        Case 46
            If InStr(Me.TextBox1.Text, ".") > 0 Then
                KeyAscii = 0
            End If

        Case 45
            If Me.TextBox1.SelStart <> 0 _
               Or InStr(Me.TextBox1.Text, "-") > 0 Then
                KeyAscii = 0
            End If

        Case Else
            KeyAscii = 0

    End Select

End Sub

「-」のキーコードは45になります。今回のコードでは、マイナス記号はTextBoxの先頭に1回だけ入力できるようにしています。

【画面キャプチャー④:小数点やマイナス値を入力したTextBoxの画面】

整数だけなら最初のコードで十分

管理番号や数量など、整数だけを扱うTextBoxであれば、最初にご紹介した数字とBackSpaceだけを許可するコードで十分かと思います。

小数点やマイナス値を必要とする場合だけ、用途に合わせて入力可能な文字を追加してください。

参考情報

最後に

いかがでしたでしょうか。

今回は、Excel VBAのUserFormでTextBoxを数字のみ入力可能にする方法についてご紹介しました。

KeyPressイベントを使用すればキーボードから不要な文字が入力されることを防ぐことができ、IsNumeric関数を組み合わせることでTextBoxの値を確定する際にもチェックすることができます。

UserFormの入力項目を作り込む際には使用する機会も多い処理になるかと思いますので、少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA