- 締切済み
keypress で特定の値を許可する方法
たとえば 5から10 と 55のみ入力OKにするにはどうすればいいでしょうか?お願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- burroughs6
- ベストアンサー率76% (29/38)
#1です。 回答のコードの5,10,55という数字は、質問の数字を使っただけです。 KeyPressに通知される値(KeyAscii)は、キーボードのキーと同じではありません。#6にあるようにAsciiコードです。 キーボードの"1" → KeyAscii=49 キーボードの"2" → KeyAscii=50 キーボードの"5" → KeyAscii=53 キーボードの"7" → KeyAscii=55 キーボードのDEL → KeyAscii=8 ですので、回答のコードで入力できるのはキーボードの"7"とDELだけです。"1234567890abc"と入力したら"7"がTextBoxに入ります。 1文字ごとにKeyPressが起動されるので、"10"と入力したらOKで"11"と入力したらNGとするようことはできません。そのような仕様ならば他の方の回答を参考にしてください。 あとは、Changeイベントをを使うということも考えられます。 Private Sub Text1_Change() If Text1.Text = "10" Then Text1.Text = "" End If End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
#1の rivate Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 5 To 10, 55 Case Else KeyAscii = 0 End Select End Sub は 5 to 10の部分は Asciiコードを書かないとダメではないでしょうか。 ーー 1文字で、全(各)桁統一に、であればKeyPressイベントでチェックは良いが、2桁の10や55をチェックするのは前の1文字を覚えておかないといけない。 第1桁目1-5はOK。0、6-9はNo。 第2桁目0と5はOK。それ以外はNO。 1と2桁あわせてが10と55はOK それ以外はエラー。 こういうロジックになるのかな。 第1桁目かどうかを保持するのが面倒。 論理的に難しい途を採っているとしか思えない。 ーー Enterが押されて、TextBoxの値が確定してから、その値が、文字列5,6,7,8,9,10,55以外はエラーにすべきでは。
- sugao_chib
- ベストアンサー率59% (22/37)
こんにちは Validatingイベントを利用したらどうでしょうか 下記の例は多少はしょってます。 テキストボックスの初期値が無効な文字だった場合(例えば空文字)などへの配慮が必要です。 Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating Dim value As Integer Try value = Int32.Parse(sender.text) Catch ex As Exception value = -1 End Try Select Case value Case 5 To 10, 55 Case Else ' メッセージなどの表示 e.Cancel = True '入力をキャンセル sender.undo() ' 元の値を表示 End Select End Sub
- burroughs6
- ベストアンサー率76% (29/38)
>またkeyPressではなくtextboxのプロパティなどで プロパティではできないでしょうね。 どうしてもプロパティでやるとしたら、ユーザコントロールで自前のtextboxを作るしかありません、
補足
Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 5 To 10, 55 Case Else KeyAscii = 0 End Select End Sub の方法では文字が何も入力できませんでした・・。 textboxという条件は決定ですが、keypressは必須ではないので、他に入力制限をかける方法ありますか?
- deecyan
- ベストアンサー率38% (89/233)
keyPress では 1文字しかとれないので 前に入力したものと比較しなければ Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If TextBox1.Text = "" Then If KeyAscii = 49 Or (KeyAscii > 52 And KeyAscii < 58) Then Exit Sub End If ElseIf TextBox1.Text = "1" And KeyAscii = 48 Then Exit Sub ElseIf TextBox1.Text = "5" And KeyAscii = 53 Then Exit Sub End If KeyAscii = 0 End Sub
- Bickyon
- ベストアンサー率41% (42/101)
やるならこんな感じでしょうか... でも、何か不自然ですよね。何故KeyPressで1文字毎に判定したいのでしょう... Private InKey As String Private Sub Text1_GotFocus() InKey = Text1.Text End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 8 'BS Case 48 '0 If InKey <> "1" Then KeyAscii = 0 End If Case 49 '1 If InKey = "" Then InKey = Chr(KeyAscii) Else KeyAscii = 0 End If Case 53 '5 If InKey <> "" And InKey <> "5" Then KeyAscii = 0 End If Case 54 To 58 '6 - 9 If InKey <> "" Then KeyAscii = 0 End If Case Else KeyAscii = 0 End Select End Sub Private Sub Text1_LostFocus() Select Case Text1.Text Case "5" To "9", "10", "55" Case Else Text1.Text = "" End Select End Sub
- burroughs6
- ベストアンサー率76% (29/38)
Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 5 To 10, 55 Case Else KeyAscii = 0 End Select End Sub
補足
またkeyPressではなくtextboxのプロパティなどで制限する方法はあるのでしょうか?
補足
回答ありがとうございます。 仕様的に、そもそも入力を受け付けてはいけない様になっていて・・。