• 締切済み

keypress で特定の値を許可する方法

たとえば 5から10 と 55のみ入力OKにするにはどうすればいいでしょうか?お願いします。

みんなの回答

回答No.7

#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)
回答No.6

#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以外はエラーにすべきでは。

noname#209802
質問者

補足

回答ありがとうございます。 仕様的に、そもそも入力を受け付けてはいけない様になっていて・・。

回答No.5

こんにちは 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

回答No.4

>またkeyPressではなくtextboxのプロパティなどで プロパティではできないでしょうね。 どうしてもプロパティでやるとしたら、ユーザコントロールで自前のtextboxを作るしかありません、

noname#209802
質問者

補足

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)
回答No.3

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)
回答No.2

やるならこんな感じでしょうか... でも、何か不自然ですよね。何故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

回答No.1

Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case 5 To 10, 55 Case Else KeyAscii = 0 End Select End Sub

noname#209802
質問者

補足

またkeyPressではなくtextboxのプロパティなどで制限する方法はあるのでしょうか?

関連するQ&A

専門家に質問してみよう