Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
テキストボックスに##.#以外の数字を受け付けないように設定したい
投稿日時: 19/01/29 16:32:45
投稿者: tomoe0441

技術計算で54個のテキストボックスへ数値(##.#)を入力するフォームを作成しましたが、入力時のタイプミスがどうしても発生してしまいます。BSキーで修正するとエラーが発生します(ヌルになるとエラー発生?)
 
現状コード:
Private Sub TextBox1_Change()
'
' 20Hzの燃焼音入力
'
    Hzdb(1) = TextBox1.Value
End Sub
 
テキストボックスに##.#以外の数値を入力できないようにできる方法があれば
教えてください(テキストボックスは半角英数入力規制しています)
 
よろしくお願いします
 
 
 

回答
投稿日時: 19/01/29 19:31:09
投稿者: WinArrow
投稿者のウェブサイトに移動

>Private Sub TextBox1_Change
テキストボックスに、1文字でも入力すると
このイベント(Change)が発生します。
 
AfterUpdateイベント
or
Exitイベントを
使って、入力した値を判定しましょう。
 
 
 
なお、テキストボックスには、"##.#"というような書式は設定できませんので
覚えておいてください。
数字だけ入力させるということもできません。
 
数字チェックの例
 
If Not IsNumeric(Me.TextBox1.value) Then
    Msgbox "数字以外エラー"
End If
 
 
 
 

回答
投稿日時: 19/01/29 20:14:00
投稿者: WinArrow
投稿者のウェブサイトに移動

54個も同じようなコードを記述すると
修正が発生したとき、手間がかかりるし、ミスも発生しやすいです。
 
数字ちぇくサブルーチンを使うと便利です。
できれば、
コントロールの名前も下2桁を数字にするなど工夫したほうが便利です。
 
Private Sub txtBox01_AfterUpdate()
    If Not SUJICHK(Me.TxtBox01) Then
        Msgbox "数字エラー"
        Exit Sub
    End If
End Sub
 
 
 
サブルーチン
Private Function SUJICHK(ByRef CTRL As MSForms.Control)
    SUJICHK = False
 
    If Not IsNumeric(CTRL.Value) Then Exit Function
    If CTRL.Value Like "*[##.#]*" Then
        SUJICHK = True
    End If
    Hzdb(Right$(CTRL.Name, 2) * 1) = CTRL.Value
End Function
 
 

回答
投稿日時: 19/01/29 22:11:41
投稿者: WinArrow
投稿者のウェブサイトに移動

>BSキーで修正するとエラーが発生します(ヌルになるとエラー発生?)
 
エラーの原因
は、
>Hzdb
の変数宣言にあると思います。
 
推測ですが
Dim Hzdb(54) As Singe
のように定義していると思います。
 
この変数には、数値しか代入できません。
ですから、数字とピリオド以外が入力されると、変数に代入する時に「型が合わない」エラーになります。
 
前レスにも書きましたが、
テキストボックスには、書式等の設定ができませんので、
入力された値を判断して、意図したデータ型に合致したものだけ変数に代入します。
因みにテキストボックスのデータ型は、文字列(String)です。
半角英数字のみを入力する設定は可能ですが、数字だけという設定はできません。

回答
投稿日時: 19/01/29 22:34:51
投稿者: hatena
投稿者のウェブサイトに移動

テキストボックス3つで、
##.#入力しかできなくするコード例。
 

Option Explicit

Private Sub TB_BeforeUpdate(ByRef Cancel As MSForms.ReturnBoolean)
    If Not Me.ActiveControl.Text Like "##.#" Then
        MsgBox "数値(##.#)を入力してください。"
        Cancel = True
    End If
End Sub

Public Sub TB_KeyDown(ByRef KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyV And Shift = 2 Then 'Ctrl + V(貼り付け) は入力不可
        KeyCode = 0
        Exit Sub
    End If
    If Me.ActiveControl.SelStart >= 4 Then '4桁以上は入力不可
        Select Case KeyCode
        Case vbKeyBack, vbKeyTab, vbKeyReturn, vbKeyLeft
        Case Else
            '上記以外は入力不可
            KeyCode = 0
        End Select
    ElseIf Me.ActiveControl.SelStart = 2 Then '3桁目は小数点のみ入力可
        Select Case KeyCode
        Case vbKeyBack, vbKeyLeft, vbKeyRight, _
             vbKeyDecimal, 190  '小数点(Dot)
        Case Else
            '上記以外は入力不可
            KeyCode = 0
        End Select
    Else
        Select Case KeyCode '上記以外は、数字と移動キーの入力可
        Case vbKeyBack, vbKeyLeft, vbKeyRight, _
             vbKey0 To vbKey9, vbKeyNumpad0 To vbKeyNumpad9
        Case Else
            '上記以外は入力不可
            KeyCode = 0
        End Select
    End If
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Call TB_BeforeUpdate(Cancel)
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call TB_KeyDown(KeyCode, Shift)
End Sub

Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Call TB_BeforeUpdate(Cancel)
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call TB_KeyDown(KeyCode, Shift)
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call TB_KeyDown(KeyCode, Shift)
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Call TB_KeyDown(KeyCode, Shift)
End Sub

Private Sub UserForm_Initialize()
    Dim i As Long
    
    For i = 1 To 3
        Me.Controls("TextBox" & i).IMEMode = fmIMEModeDisable 'IME使用不可
    Next
End Sub

 
54個の場合は、TextBox#_BeforeUpdate と TextBox#_KeyDown を54個記述する必要あり。
 
クラスモジュールにすると、これが必要なくなるのでシンプルになります。要望があればコード提示します。

投稿日時: 19/02/04 09:49:40
投稿者: tomoe0441

おはようございます
 
WinArrowさま
丁寧なご説明ありがとうございました、教えて頂いた「AfterUpdate」は初めて使いエラーも
回避できかつ入力ミス時に修正できるようになりました。##.#のサブルーチンは今回は見送り
ました。またコントロール名を2桁にすることでコード表示順番が正しくなり見やすくなりま
した。
 
hatenaさま
詳しいコードを教えて頂きありがとうございます。ちょっと私にはレベルが高い内容なります
次回一度試してみたいと思います
 
最後に
今回初めてmougのQ&Aに質問させて頂き、こんなに早くご返信頂き助かりました
VBA初心者なのでまた初歩的な質問となりますが、また教えてください