• ベストアンサー

VBでの入力値制限について

はじめまして。 VBのテキストボックスに値を入力していき、ある桁数になるとメッセージを表示する仕組みを作りたいと考えています。 例えばVBで用意したテキストボックスにキーボードで123と入力しキーボードの4を押した直後に「桁数は3桁までです。」というメッセージを表示したいのですがいい方法を教えていただけないでしょうか? 自分で以下のように作ってみたのですがこれだとキーボードで123と入力し次に4を入力した時にテキストボックスに4が表示されてからエラーが出ます。そうではなく4をテキストボックスに表示させずに4をおしたら以下のメッセージが出るようにしたいのです。 よろしくお願い致します。 Private Sub text1_Change() If Len(text1.Text) > 3 Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

入力する文字の条件が微妙ですが、こんなような感じでしょうか。 Private Sub Text1_KeyPress(KeyAscii As Integer) If Len(Text1.Text) >= 3 And _ ((KeyAscii >= Asc("A") And KeyAscii <= Asc("z")) _ Or (KeyAscii >= Asc("0") And KeyAscii <= Asc("9"))) Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" KeyAscii = 0 End If End Sub

eiki0520
質問者

お礼

お世話になります。 数値以外の入力ですが自分で調べたら以下の方法で上手くいきました。アドバイスありがとうございます。 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyBack Then Exit Sub If Not Chr(KeyAscii) Like "[0-9]" Then KeyAscii = 0 MsgBox "数値以外です。" Else If Len(Text1.Text) >= 3 And _ ((KeyAscii >= Asc("A") And KeyAscii <= Asc("z")) _ Or (KeyAscii >= Asc("0") And KeyAscii <= Asc("9"))) Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" KeyAscii = 0 End If End If End Sub

eiki0520
質問者

補足

お世話になります。 ありがとうございます。うまくいきました。 それからもう一つ要望なのですが数値以外の値を入力した時は「数値以外は入力できません。」というメッセージをを出し入力受け付けないようにしたいのですがどうすれば良いでしょうか? 以下のように考えてみたのですが上手くいきません。よろしくお願い致します。 Private Sub Text1_KeyPress(KeyAscii As Integer) If IsNumeric(Right(Text1.Text, 1)) = False Then MsgBox "数値以外です。" KeyAscii = 0 Exit Sub End If If Len(Text1.Text) >= 3 And _ ((KeyAscii >= Asc("A") And KeyAscii <= Asc("z")) _ Or (KeyAscii >= Asc("0") And KeyAscii <= Asc("9"))) Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" KeyAscii = 0 End If End Sub ※1桁目が数値以外だと受け付けませんが1桁目が数値で2桁目が数値以外ならそれは受け付けずに2桁目から 再度入力できるようにしたいと思っています。 よろしくお願い致します。

その他の回答 (4)

noname#22222
noname#22222
回答No.5

s_husky です。 実際は、サンプルのような使い方はできません。 メインで昔むかーしのように全体のテキストボックスを管理しなければなりません。 あくまでも、チェック要領の参考に!

noname#22222
noname#22222
回答No.4

少し、趣の変わった回答です。 Private Sub Text1_KeyPress(KeyAscii As Integer)   EditText KeyAscii, "INTEGER", 3 End Sub これで、Text1には3桁の数字しか入力できません。 OSがWindows98までを想定した関数ですので多少XP版にするには手直しが必要です。 が、まあ、一々、テキストボックスの入力チェックルーチンを書くのも手間です。 このような関数を使うのも手です。 ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ' 入力テキストボックスを編集する関数 ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Sub EditText(ByRef KeyAscii As Integer, ByVal ColType, ByVal MaxLength As Integer)   Dim I    As Integer   Dim L    As Integer   Dim R    As Integer   Dim Del   As Integer   Dim Text  As String   Dim RStr  As String   Dim Start  As Integer   Dim Suji  As Integer   Dim Uwagaki As Boolean     If TypeOf Screen.ActiveControl Is TextBox Then     Select Case KeyAscii       Case 0, 3, 8, 13, 24, 26, 27       Case 22         'Temp = Clipboard.GetText(vbCFText)         'L = Len(Temp)         'For I = 1 To L           'EditText Asc(Mid(Temp, I, 1)), ColType         'Next I       Case Else         'Uwagaki = Screen.ActiveForm.ModeButton.Enabled         Uwagaki = True         Start = Screen.ActiveControl.SelStart         Text = Screen.ActiveControl.Text         If Uwagaki Then           '           ' カーソル位置の文字を消すと、結果として上書きされます           '           L = Len(Text)           ' 末尾以外のみ上書き処理           If Start < MaxLength Then             If Start < L Then               ' 最低1文字は消去               ' 全角入力で半角の上は2文字消去               Del = 1 + (LenB(Mid(Text, Start + 1, 1)) = 1) * (KeyAscii < 0)               ' 上書き箇所より右の残存文字数を求める               R = L - Start - Del               If R > 0 Then                 RStr = Right$(Text, R)               End If             End If             Text = Left$(Text, Start) & RStr           Else             MsgBox "定められた桁数以上は入力出来ません。"             KeyAscii = 0           End If         End If         If InStr(1, "INTEGER, SMALLINT, DECIMAL, MONEY", Trim(UCase(ColType)), vbTextCompare) > 0 Then           Suji = True           Select Case KeyAscii             Case Asc("-")               Suji = InStr(1, Text, "-", vbTextCompare) = 0 And Start = 0             Case Asc(".")               Suji = InStr(1, Text, ".", vbTextCompare) = 0             Case Is < Asc("0"), Is > Asc("9")               Suji = False           End Select           If Not Suji And KeyAscii <> 0 Then             MsgBox "数字以外の文字は入力出来ません!"             KeyAscii = 0             'Text = ""             'Start = 0           End If         End If         Screen.ActiveControl.Text = Text         Screen.ActiveControl.SelStart = Start     End Select   End If End Sub

eiki0520
質問者

補足

お世話になります。 ご回答ありがとうございます。 今後の参考にさせていただきます。 ところでRight・Left関数に付いてる「$」マークは何か意味があるのでしょうか? MSDNで調べても見つからなかったのでご存知でしたら教えていただきたいです。 よろしくお願いします。

  • dober-o
  • ベストアンサー率59% (260/439)
回答No.2

いろいろなやり方があるでしょうが、 Private Sub Text1_KeyPress(KeyAscii As Integer) If Len(Text1.Text) >= 3 And (KeyAscii < 0 Or KeyAscii > 31) Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" KeyAscii = 0 End If End Sub 制御文字は考慮していますが、全角入力はあまり考慮していません。 なおご存知かもしれませんが、TEXT のプロパティの MaxLength を変更すれば、 メッセージは出ませんが文字数制御はできます。

eiki0520
質問者

お礼

お世話になります。 ご回答ありがとうございます。 MaxLengthについても自分で勉強してみます。 これからもよろしくお願いします。

回答No.1

あ、この辺の制御は最近やってないな(^^; とりあえず、以下のようなコードなら出来ますね。ちらつきを防ぐために Visible プロパティも操作してみました。 If Len(Text1.Text) > 3 Then Text1.Visible = False Text1.Text = Left$(Text1.Text, Len(Text1.Text) - 1) Text1.Visible = True MsgBox "桁数は3桁までです!" Exit Sub End If ちょっとトリッキー? スマートな解決策があったら回答者も知りたいです(笑)

eiki0520
質問者

お礼

お世話になります。 ご回答ありがとうございました。 今後もよろしくお願いします。

関連するQ&A

  • ExcelのVBAで桁数制限を設けたい

    続けてVBAの質問をさせていただきます。 例えばA1セルの桁数を半角で12桁と条件を設定しています。 ブランクであれば問題無しでよいのですが、値が入っている状態で 12桁未満または12桁以上を入力した場合にアラートを表示させるには どうすればよいでしょうか? If Worksheets("Sheet1").cells(1, 1).length <> 12 then msgbox "桁数が誤っています", vbOkOnly Exit Sub End If こんな感じで作ったもののうまくいきません。 一行目がおかしいようですがどう直せばいいでしょうか?

  • 効率の良いテキストボックスの検知について

    VB6の初心者です。質問させていただきます。 画面上に5つのテキストボックス(TEXT1、TEXT2、TEXT3、TEXT4、TEXT5)と 1つのコマンドボタン(Cmd_SAVE)があり、 画面上の5つのテキストボックスをすべて記入し、 コマンドボタンを押すと、登録確認のメッセージボックスが表示され、 OKボタンを押すと、サーバへ転送され、 画面上のテキストボックスにひとつでも空欄があると、どのテキストボックスが 空欄であるかを示すメッセージが表示される処理をさせています。 そこで質問なのですが、今、メッセージボックス、登録処理は出来るようになったのですが、 とても処理の効率が悪い、もっと空欄を確認するのにすっきりとしたコードはある、と知り合いに言われました。 おそらく、繰り返し等を用いると思うのですが、メッセージにそれぞれのオブジェクト名を代入するやり方がわかりません。 下記が今のコーディングです。 Private Sub Cmd_SAVE_Click()   If TEXT1.Text = "" Then      MsgBox "TEXT1が登録されていません", vbOKOnly, "警告"     Exit Sub   End If   If TEXT2.Text = "" Then      MsgBox "TEXT2が登録されていません", vbOKOnly, "警告"     Exit Sub   End If   If TEXT3.Text = "" Then      MsgBox "TEXT3が登録されていません", vbOKOnly, "警告"     Exit Sub   End If   If TEXT4.Text = "" Then      MsgBox "TEXT4が登録されていません", vbOKOnly, "警告"     Exit Sub   End If   If TEXT5.Text = "" Then       MsgBox "TEXT5が登録されていません", vbOKOnly, "警告"     Exit Sub   End If   If MsgBox("入力データを登録しますか?", vbOKCancel, "登録確認") = vbCancel Then     Exit Sub   End If   End If ~登録処理~ End Sub どのような書き方がきれいで、効率的なコーディングなのでしょうか? ご教示お願いします!

  • ACCESS2003のテキストボックスの最大桁数について

    Access2003のテキストボックスには、MaxLengthプロパティがありません。変わりに以下のような、コードで対応しようと試みたのですが、いまいち動きが悪いのです。以下のコードは、最大4桁までテキストボックスに入力可能とします。 Private Sub txtBox_KeyPress(KeyAscii As Integer)   If Len(txtBox.Text) > 3 Then     KeyAscii = 0   End If End Sub 最大入力桁数4桁を実現していますが、4桁入力後『Insert』キーを押下して、上書きモードでの修正ができません。 以下例1はOKですが、例2が実現できません。 例1:1回目新規入力『12』 ⇒ 2回目修正『123』⇒3回目修正『1234』 例2:1回目新規入力『1234』 ⇒ 2回目修正『9999』 VBのMaxLengthプロパティのようなことはできないのでしょうか?

  • VBA の IF then 文につぃて

    access2000でテーブルに連結していないフォームがあり その中のテキストボックスにバーコードや磁気カードで読み込ませその桁数によって処理を分けようと思っていますが、どのようにコードを書けばよいのかおしえてください。 たとえば、 private sub() if 入力テキスボックス が 8桁 then 磁気カード処理 if 入力テキストボックスが 11桁 then バーコード処理 end if end sub public sub 磁気カード処理() public sub バーコード処理() のような形です。 どうかお願いします

  • VB6のIF文について教えてください

    VB6でプログラムについて、みなさんアドバイスをいただけませんでしょうか? 現在、下記のような動作をするプログラムを作っていていますがうまくいきません。 テキストボックスに1~100までの数値を400個入力します。 ボタンを押してこのテキストボックスヘ数値を入力したとき、入力した数値が10未満の 場合はメッセージボックスで「NG」と表示。 それ以外は、メッセージボックスで「OK」と表示プログラムを作っています。 ※これは、テキストボックスに数値を入力して、改行を押した際に、毎回OK・NG判定を  して表示する 今下記のように作っているのですが、苦戦しているのは、数値を入力して改行したときに 毎回メッセージボックスが出ず、エラーが出てしまいます。 下記プログラム文をどのように変更すれば、数値を入力して改行したときに毎回上記のよ うな判定できるようになるかご教示頂けませんでしょうか? みなさん教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim moji As String moji = txtInputData.Text     If moji > 10 Then   Msgbox "NG"   Else  Msgbox "OK" End If End Sub

  • ACCESSVBAで桁数を調べたい

    フォーム作成し、テキストボックスに数字を入力してコマンドボタンをクリックすると、入力してある桁数をメッセージボックスに出力するように、以下のコードを書きました。 テキストボックスに11ケタ以上の数字を入れたら、『オーバーフロー』のエラーになります。データ型を「通貨」にしても同じです。 どうしたら、11ケタ以上の数値が調べれますか? Private Sub コマンド2_Click() Dim dat As Long '桁を調べるデータ Dim cnt As Integer '10で割った回数 '変数の初期化 dat = CLng(Me!テキスト0) cnt = 0 '10で割り算 Do While dat > 0 dat = dat \ 10 '10で割る cnt = cnt + 1 '回数を数える Loop msgbox cnt & "桁", vbOKOnly, "繰り返し" End Sub

  • VBAで数値入力について

    Excel VBAで、UserFormにTextBoxを配置しています。 TextBoxに入力された数値は、半角数値で正数で小数点以下の桁数は1までと制限したいです。 現在は下記のプログラムにしているのですが、「1.2.3」と入力されるとエラーが表示されずに通ってしまいます。。。 どのようにしたらよいのでしょうか。 For i = To Len(TextBox1.Text) If Not Mid(TextBox1.Text, i, 1) Like "[0-9 And .]" Then Message"半角数値ではありません" Exit Sub End If Next i If Val(Text1.Text) = 0 Or TextBox1.Text = "" Then Message"数値を入力してください" Exit Sub End If

  • VB2010入力制御について

    ・計算機アプリケーションです ・テキストボックスは数値と「-(マイナス)」「.(小数点)」以外は入力できないように制御しています。 ・テキストボックス1と2に入力したものをボタン1を押して計算し、ラベル2に表示します。 テキストボックスに数値以外が、もしくは「3-2」「.32」「32.」等の不正な値が入った場合に、メッセージボックスを出して入力の誤りを指摘するプログラムを書きたいです。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ If Not IsNumeric(TextBox1.Text) Then MsgBox("不正な値です", vbExclamation, "ERROR") Label2.Text = "ERROR" ElseIf Not IsNumeric(TextBox2.Text) Then MsgBox("不正な値です", vbExclamation, "ERROR") Label2.Text = "ERROR" End If End Sub 色々と調べてみて、IsNumericが使えそうだったのでこのプログラムを書いたのですが、 これだと「-」や「.」だけを書いた場合にはちゃんとエラーメッセージが出ますが、 「32-」「.32」「32.」等は数字だけを認識して、計算結果を表示してしまいます。 何が足りないのか、もしくは使用している関数を変えたほうがいいのか、アドバイスいただければ幸いです。 以上、ご回答宜しくお願い致します。

  • 【Access2000】VB記述でつまづいています。

     非連結のテキストボックスを2つ作成し、そのテキストボックスに、それぞれIDとパスワードを入力することにより「TOP」という名前のフォームを開くログイン用のフォームを作成しています。 ・このログイン用のフォーム名は「ログイン」。 ・フォームの中にあるID入力用のテキストボックス名は“txtNamePass” ・同じくパスワード入力用のテキストボックス名は“txtCountPass” ・IDとパスワードを入力した後に開くフォームは「TOP]。  この「ログイン」という名前のフォームにある“txtCountPass”の「更新後処理」の所に以下のコードを記述したところ、IDとパスワードを入力後、「TOP」のフォームは開くのですが、「ログイン」のフォームが閉じないままになってしまいます。  どのように書き直したらいいか御存知の方がいらっしゃったら御教示下さい。  Private Sub txtCountPass_AfterUpdate() Dim TextBoxA As TextBox Dim TextBoxB As TextBox Set TextBoxA = Me.txtNamePass ' --- A Set TextBoxB = Me.txtCountPass Const NamePass = "@@@@" ' --- B Const CountPass = "*****" If TextBoxA = NamePass Then ' --- C If TextBoxB = CountPass Then ' --- D DoCmd.OpenForm "TOP" ' --- E DoCmd.Close , "ログイン" Else MsgBox "パスワードが異なります。", vbOKOnly + vbCritical End If Else MsgBox "IDが異なります。", vbOKOnly + vbCritical End If End Sub

  • 入力判定の仕方が分からなくて、困ってます・・

    VB.NETで、キーボードから入力してLabelに表示されている文字と 合っていれば正解、間違っていれば不正解の処理を1文字単位でやりたいのですが、正解不正解の判定のやり方が分かりません・・。 Private Sub Form1_KeyPress() If Mid(Label2.Text, a, 1) = "入力したのと同じ" Then Mid(Label2.Text, a, 1) = ""     a = a + 1 Else  ’不正解の処理 ?? End If End Sub みたいかな?と思ってプログラムを組んでみたのですが、 ifの"入力したのと同じ"ところの書き方が良く分かりません。 詳しい方、KeyPressの使い方等教えていただけませんか?

専門家に質問してみよう