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)
を外してみましたがやはりうまくいきませんでした。
どのように改良すれば良いでしょうか?
No.1
- 回答日時:
以下のようにしてください。
----------------------------------------------------------------------------------
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)も同様)
No.2
- 回答日時:
失礼しました。
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"であること
としています。
No.3
- 回答日時:
#2です。
>ただ5.67のような0から始まらない小数値は禁止されているのですが
>整数だと普通に1以上の値も入力できてしまいます。
具体的には、どのような値でしょうか。
私の環境では、
第1文字目は、"0"のみOK
第2文字目は、"."のみOK
第3文字以降は、"0"~"9"のみOKです。
つまり、
0.12 とか
0.0001 などがOKで
78 などは、入力できないはずですが。
又、最初のテキストボックスは、なにも入力されていないことが前提です。
この前提でない場合は、その旨補足してください。
又その場合は、どのようなじょうたいなのでしょうか?
No.4
- 回答日時:
#3です。
>0.2など、初期値が最初から設定されている場合にはどうしたら良いですか?
>また、一度数値を入力してから上から新たに数値を入力したい場合にも使えないのですが。
その場合、どのような結果になることを望まれていますか?
例1:0.2
例2:887
のようなデータがテキストボックスに設定されている場合、
どのような結果になることを望んでますか?
又、上記の例以外にも、私が想定していない例が、あれば、
その例と望まれる結果を補足してください。
No.5
- 回答日時:
ネライを誤解しているのかもしれませんが、
① 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
No.6
- 回答日時:
#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を入力してください。
No.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又は小数点の前に移動し、キーを押した場合は、無効となるように
しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) VBA 同日で2回目(午後)の体温を登録するときのコード 3 2022/08/28 20:29
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
256色で任意の色を作成する時、...
-
コンボボックスからテキストボ...
-
エクセルVBAでテキストボッ...
-
【VB.NET】テキストボックスに...
-
Excel ユーザーフォームで計算 ...
-
ユーザーフォームへのデータ入...
-
アクセスできない保護レベルエ...
-
visual basic初心者です。 visu...
-
Xcodeのテキストボックスの値に...
-
VBでローマ字入力とかな入力を...
-
特定の文字だけ太文字にするに...
-
【C#】コンボボックスにおけるS...
-
C#のループでtextboxに値を入れ...
-
C言語のサフィックスについて
-
VBAでcallで呼び出したsubを終...
-
[Excel2000]auto_closeを止めさ...
-
sublimit textっていうエディタ...
-
Excel VBAでsub,dimは何の略?
-
C言語のOpenGLで複数のテクスチ...
-
演奏記号の・・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでテキストボッ...
-
アクセスできない保護レベルエ...
-
visual basic初心者です。 visu...
-
VBAで入力数値について
-
ユーザーフォームへのデータ入...
-
【VB.NET】テキストボックスに...
-
Excel ユーザーフォームで計算 ...
-
VBでの入力値制限について
-
ACCESS 除算での小数点切上げ方法
-
テキストボックスを空白にする方法
-
【C#】コンボボックスにおけるS...
-
TEXTBOXの表示形式の変...
-
visual studio 2008 C# で、値...
-
テキストボックス1の値に対する...
-
256色で任意の色を作成する時、...
-
VBAのフォーム カーソル移動
-
VBAのユーザーフォームで、テキ...
-
Vba 電卓のテキストボックスに...
-
VBSのプログラム
-
整数かどうかチェックする
おすすめ情報
ありがとうございます。
もっとも重要な1以上の数値の入力を禁止するという条件が盛り込まれていないのですが
どうすれば良いでしょうか?
ありがとうございます。
試してみたのですが、
ただ5.67のような0から始まらない小数値は禁止されているのですが
整数だと普通に1以上の値も入力できてしまいます。
どうすれば良いでしょうか?
0.2など、初期値が最初から設定されている場合にはどうしたら良いですか?
また、一度数値を入力してから上から新たに数値を入力したい場合にも使えないのですが。
例1:0.2
の時には何もせずに
例2:887
の時に自動的に0.999に再設定するような機能がほしいのですが