プロが教えるわが家の防犯対策術!

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

A 回答 (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
    • good
    • 0

#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:21
    • good
    • 0

こんにちは


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
    • good
    • 0

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

補足日時:2007/09/20 09:19
    • good
    • 0

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
    • good
    • 0

やるならこんな感じでしょうか...


でも、何か不自然ですよね。何故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
    • good
    • 0

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のプロパティなどで制限する方法はあるのでしょうか?

補足日時:2007/09/19 22:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!