こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2007-09-19 17:36:53

QNo.3359050

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.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

投稿日時 - 2007-09-20 20:48:50

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

投稿日時 - 2007-09-20 11:16:04

補足

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

投稿日時 - 2007-09-20 11:21:06

ANo.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

投稿日時 - 2007-09-20 10:57:20

ANo.4

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

投稿日時 - 2007-09-19 22:57:06

補足

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は必須ではないので、他に入力制限をかける方法ありますか?

投稿日時 - 2007-09-20 09:19:20

ANo.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

投稿日時 - 2007-09-19 21:42:43

ANo.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

投稿日時 - 2007-09-19 21:14:35

ANo.1

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

投稿日時 - 2007-09-19 20:45:59

補足

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

投稿日時 - 2007-09-19 22:43:59

あなたにオススメの質問