アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAのテキストボックスに1未満の値のみが代入できるようにしたいのですが


http://detail.chiebukuro.yahoo.co.jp/qa/question …

このページを参考にして数値以外の代入の禁止を行った上で
以下のコードを試してみましたのですが
不審な挙動をしてうまくいきません。



Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If (KeyAscii < Asc(0) And KeyAscii <> Asc(".")) Or KeyAscii > Asc(9) Then

KeyAscii = 0

End If


TextBox5.Text = Val(TextBox5.Value)


If Val(TextBox5.Value) >= 1 Then

TextBox5.Value = Val(1)

End If


End Sub



TextBox5.Text = Val(TextBox5.Value)
というところは例えば、「0.00..42」などのように複数のピリオドが代入された場合に
数値に変換するために入れています。

これを実行すると
なぜか13とか15とか1x系の数値しか代入することができません。

TextBox5.Text = Val(TextBox5.Value)

を外してみましたがやはりうまくいきませんでした。

どのように改良すれば良いでしょうか?

質問者からの補足コメント

  • ありがとうございます。

    もっとも重要な1以上の数値の入力を禁止するという条件が盛り込まれていないのですが
    どうすれば良いでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/04 11:55
  • ありがとうございます。

    試してみたのですが、

    ただ5.67のような0から始まらない小数値は禁止されているのですが
    整数だと普通に1以上の値も入力できてしまいます。


    どうすれば良いでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/10/04 14:35
  • 0.2など、初期値が最初から設定されている場合にはどうしたら良いですか?
    また、一度数値を入力してから上から新たに数値を入力したい場合にも使えないのですが。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/10/04 16:47
  • 例1:0.2
    の時には何もせずに

    例2:887
    の時に自動的に0.999に再設定するような機能がほしいのですが

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/10/04 22:04

A 回答 (7件)

#6の内容で、コーディングしました。


以下のようにしてください
---------------------------------------------------
Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim ret As Integer
ret = check_data(TextBox5.text)
If ret < 0 Then
TextBox5.text = "0.999"
KeyAscii = 0
Exit Sub
End If
If ret = 0 Then
If KeyAscii <> Asc("0") Then
KeyAscii = 0
End If
End If
If ret = 1 Then
If TextBox5.SelStart = 0 Then
KeyAscii = 0
End If
If KeyAscii <> Asc(".") Then
KeyAscii = 0
End If
End If
If ret > 1 Then
If TextBox5.SelStart < 2 Then
KeyAscii = 0
End If
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
End If
End If
End Sub


Private Function check_data(ByVal text As String) As Integer
check_data = Len(text)
If Len(text) = 0 Then
Exit Function
End If
If Len(text) = 1 Then
If text <> "0" Then
check_data = -1
End If
Exit Function
End If
If Len(text) = 2 Then
If text <> "0." Then
check_data = -1
End If
Exit Function
End If
If Len(text) >= 3 Then
If Mid(text, 1, 2) <> "0." Then
check_data = -1
End If
If IsNumeric(Mid(text, 3)) = False Then
check_data = -1
End If
Exit Function
End If
End Function
--------------------------------------------------------
又、0.234のような状態で
カーソルを0又は小数点の前に移動し、キーを押した場合は、無効となるように
しました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

もう少し調べてみます。

お礼日時:2015/10/10 15:46

#4です。


>例1:0.2
>の時には何もせずに

>例2:887
>の時に自動的に0.999に再設定するような機能がほしいのですが

ということですが、
このTextBox5_KeyPressは何らかのキーが押下された時に、呼び出される処理です。

例1の場合
0.2の状態で、3を押下すれば、0.23になりますが、そのような機能でよいのでしょうか?
つまり、1未満の正しいデータであれば、最後に押下したキーのデータが付加されることを
想定する(つまり、0.23になるのでOKにする)

例2の場合
887の状態で、3を押下すると、一旦、0.999になります。(3以外の値でも同様)
その後は、0.999の後に更にキーを押すと、例えば3のキーを押すと、0.9993になります。

上記のような、仕様で良いでしょうか?

又、一旦、入力してから、新たに入力する場合は、BackSpaceキーでデータを全て消去するか、必要なところまで消去し、その後から入力するようにしてください。
例 0.234を0.789にしたい場合は
backSpaceキーで、0.の後ろまで削除し、(つまり234を削除し)、その後で789を入力してください。
    • good
    • 0

ネライを誤解しているのかもしれませんが、


① userformのテキストボックスに、数値キーパッドを使わずに、winのフルキーボードから入力する
② アルファベットやF1~F12、その他のファンクションキーは原則使わない。
③ 使うのは0~9、priod、Enter、Backspaseだけ
④ 先頭の入力が1~9の場合は、それだけで「0.999+Enter」とみなしてしまう。
⑤ 先頭の入力が0の場合あるいは.の場合は、それだけで「0.」とみなしてしまう。
⑥ 入力途中で複数回[.]が入力されても、無視してしまう。
例:「.035.457.23..8」⇒「0.035457238」とみなしてしまう。
➆ 入力途中でアルファベットキーなどが押された場合は、それまでの入力をすべてクリアしてしまう。(強制的。既入力データの一括キャンセル)
⑧ Enterを押すと、userFormを終了する。

大雑把に上のような仕様で、入力をするのだと仮定して、参考のコードを書くと、次のようなものも考えられます。
《結果》⑧のEnterでUserFormを終了すると、TextBox5の中に表示されていた数字が、数値として《Cells(3, 1) = tet》で入ります。
  ~~~~~   ~~~~~

Private Sub TextBox5_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If Not (KeyCode >= Asc(0) And KeyCode <= Asc(9)) And _
Not (KeyCode > 188 And KeyCode < 191) And _
KeyCode <> vbKeyReturn And Not (KeyCode = 8) Then
KeyCode = 0
TextBox5.Value = "": ' clear input & continue inputting
Exit Sub
End If

If KeyCode = vbKeyReturn Then
tet = TextBox5.Text: Cells(3, 1) = tet: Unload Me
End If

naka = TextBox5.Text: nakal = Len(naka)
Select Case KeyCode
Case 8
If nakal = 2 Then TextBox5.Text = "0.."
Case 48
If nakal = 0 Then KeyCode = 0: TextBox5.Text = "0."
Case 190
If nakal > 2 Then
KeyCode = 0
Else
TextBox5.Text = "0"
End If
End Select

If nakal = 0 And KeyCode > 48 And KeyCode < 58 Then
TextBox5.Text = "0.999"
KeyCode = 0
End If

End Sub
    • good
    • 0

#3です。


>0.2など、初期値が最初から設定されている場合にはどうしたら良いですか?
>また、一度数値を入力してから上から新たに数値を入力したい場合にも使えないのですが。
その場合、どのような結果になることを望まれていますか?
例1:0.2
例2:887
のようなデータがテキストボックスに設定されている場合、
どのような結果になることを望んでますか?
又、上記の例以外にも、私が想定していない例が、あれば、
その例と望まれる結果を補足してください。
この回答への補足あり
    • good
    • 0

#2です。


>ただ5.67のような0から始まらない小数値は禁止されているのですが
>整数だと普通に1以上の値も入力できてしまいます。
具体的には、どのような値でしょうか。
私の環境では、
第1文字目は、"0"のみOK
第2文字目は、"."のみOK
第3文字以降は、"0"~"9"のみOKです。
つまり、
0.12 とか
0.0001 などがOKで
78 などは、入力できないはずですが。
又、最初のテキストボックスは、なにも入力されていないことが前提です。
この前提でない場合は、その旨補足してください。
又その場合は、どのようなじょうたいなのでしょうか?
この回答への補足あり
    • good
    • 0

失礼しました。

1未満の入力だったのですね。
以下のようにしてください。
------------------------------------------
Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If TextBox5.Text = "" Then
If KeyAscii <> Asc("0") Then
KeyAscii = 0
End If
ElseIf TextBox5.Text = "0" Then
If KeyAscii <> Asc(".") Then
KeyAscii = 0
End If
ElseIf KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
End If
End Sub
------------------------------------------
第1文字目は、"0"であること
第2文字目は、小数点であること
第3文字目以降は、"0"~"9"であること
としています。
この回答への補足あり
    • good
    • 0

以下のようにしてください。


----------------------------------------------------------------------------------
Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < Asc("0") And KeyAscii <> Asc(".")) Or KeyAscii > Asc("9") Then
KeyAscii = 0
End If
If (KeyAscii = Asc(".")) Then
If TextBox5.Text = "" Or InStr(TextBox5.Text, ".") <> 0 Then
KeyAscii = 0
End If
End If
End Sub
------------------------------------------------------------------------------------
以下の基準で入力文字を許可しています。
1.小数点及び"0"~"9"の文字をOKとし、それ以外は許可しない。
2.小数点が許可されるのは、第2文字目以降の場合のみ。(.123 はだめ)
3.小数点が許可されるのは1回限りとする。(1.23.45.78はだめ)
(最初に入力された小数点が有効となる)

上記の基準でまずい場合は、補足してください。
なお、Asc関数ですが、文字列を引数にとるので、
Asc(0)ではなく、Asc("0")がよいでしょう。(Asc(9)も同様)
この回答への補足あり
    • good
    • 0

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