• ベストアンサー

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

  • gazo
  • お礼率30% (74/241)

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんばんは。 どのイベントをお使いかわかりませんが、期待値以外の入力をアラート表示 するよりは、いっそ入力自体を阻止する方がストレスの無い仕様かも。 ということで、別案を提案します。 もし TextBox が複数あるようなら一度次のような仕組みをクラス化しておくと 良いと思います。若干コードが煩わしくなりますが...  # 余談ですが、IsNumeric は例えば IsNumeric("3E3") で True を返すなど、  # 幾つかの文字列で予想外の結果を返します Private Sub UserForm_Initialize()   ' IME を無効にしておけば半角入力される   TextBox1.IMEMode = fmIMEModeDisable End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)   ' 余計なピリオドはカットする   With TextBox1     If Right$(.Text, 1) = "." Then       .Text = Left$(.Text, Len(.Text) - 1)     End If   End With End Sub Private Sub TextBox1_KeyDown( _     ByVal KeyCode As MSForms.ReturnInteger, _     ByVal Shift As Integer _ )   Dim sTxt As String   Dim iPos As Long   Dim iSel As Long      With TextBox1     sTxt = .Text     iSel = .SelStart   End With   Select Case KeyCode     ' 数字は OK。ただし少数第一位まで     Case vbKey0 To vbKey9, vbKeyNumpad0 To vbKeyNumpad9        iPos = InStr(sTxt, ".")        If InStr(sTxt, ".") > 0 Then         If iSel > iPos Then           KeyCode = 0         End If        End If     ' 特定の制御キー     Case vbKeyReturn, vbKeySeparator, vbKeyTab, vbKeyBack, _        vbKeyDelete, vbKeyLeft To vbKeyDown     ' マイナス     Case vbKeySubtract, 189        If InStr(sTxt, "-") > 0 Or iSel > 1 Then KeyCode = 0     ' ピリオド     Case vbKeyDecimal, 190        If InStr(sTxt, ".") > 0 Then KeyCode = 0     ' その他キーは入力をキャンセルする     Case Else        KeyCode = 0   End Select End Sub

その他の回答 (3)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.3

一文字ずつ分解して確認するよりは まずは「IsNumeric」関数で数値かどうかを判別して、次に0以上かどうか、そして最後に小数点の桁数は例えば「Abs」関数で絶対値を出してしまえば小数点以下の数値が引き算で出せるので、あとはLenでカウントするとか。 半角かどうかは内部処理で数字に変換すれば良いだけのことなのでわざわざ禁止処理にしなくても良いのではないかなと。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

小数点以下1桁のチェックを忘れていました ... Dim n as Integer n = 0 も追加して ご質問の 最初のEnd Ifの後で if m > 0 then n = n + 1 とします 先の投稿で修正したIf文の条件に or n > 1 を追加してください

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

. をカウントするようにしてみてはいかがでしょう forループの前に dim m as Integer m = 0 を追加 if文の前に if Mid(TextBox1.Text,i,1) = "." then m= m + 1 ifの条件を if not ( Mid(TextBox1.Text,i,1) Like "[0-9 and .]") or m> 1 then としてみましょう ...

関連するQ&A

  • VBAの計算について教えてください。

    お世話になります。 VBA超初心者です。 教えて頂けると助かります。 ユーザーフォームにテキストボックス1、2、3を作成し、それらを計算させて テキストボックス4に表示をさせたいと考えています。 テキストボックスに入力するパターンは以下の2種類です。 (1)すべてのテキストボックスに数値が入る (2)テキストボックス3のみに数値が入る 行いたい計算は、“(テキストボックス1 × テキストボックス2) + テキストボックス3”です。 曲りなりに作成してみましたが、テキストボックス3の数値を変えた時や削除した時などに、 テキストボックス4に入っている数値が残っていたりと、思うようにできません。 作成したものを掲載しておきます。 何卒よろしくお願いします。 テキストボックス1を変更したとき 1、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox1_Change() If TextBox1.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス2を変更したとき 2、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox2_Change() If TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス3を変更したとき 1、2、3に数値が入っていれば、以下の計算を。 1か2に数値がなく、3に数値があれば、3の数値をテキストボックス4へ。 それ以外は“0”をテキストボックス4へ Private Sub TextBox3_Change() If TextBox1.Value = True And TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) ElseIf TextBox1.Value = False or TextBox2.Value = False And TextBox3.Value = True Then TextBox4 = Val(TextBox3.Text) Else texbox24 = 0 End If End SubEnd Sub

  • VBA書き込み数値の加算?

    エクセル2000のVBAにて下記のコードを書き込み コマンドボタン1にてエクセルに入力処理後 Label8数値の加算をエクセル関数SUNを使用して =SUM(E4:E1000)を行ったのですが、加算数値が0になってしまいます。 =E4+E5+E6・・・・だと加算した数値が表示されます。 (さすがにこれは避けたいです) 何か方法があると思いますが教えていただけますでしょうか? Dim i As Integer Dim k As Integer Private Sub CommandButton1_Click() With ActiveSheet For k = 4 To 1000 If .Cells(k, 1) = "" Then .Cells(k, 1) = TextBox1 .Cells(k, 2) = Label6 .Cells(k, 3) = Label7 .Cells(k, 4) = TextBox2 .Cells(k, 5) = Label8 TextBox1 = "" Label6 = "" TextBox2 = "" Label7 = "" Label8 = "" Exit Sub End If Next k End With End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then Label8 = Application.WorksheetFunction.Round(Val(Label7) * Val(TextBox2), 0) Label8 = Format(Label8, "#,##0") End If End Sub

  • VBAでエラー時の処理について

    入力画面には3つのTextBoxあり、すべてを入力したら「記入」ボタンをクリックします。 その時、TextBox2とTextBox3の合計がTextBox1の値と一致するか判定します。 一致した場合は、その値を選択したセルに表示し、一致しなかった場合は、メッセージを表示させ、メッセージの「OK」ボタンをクリックすると「記入」ボタンがクリックされる前の状態(UserForm1の入力項目にデータが入力されている状態)に戻したいのですが、どのようにしたらよいのでしょうか。 現在は、下記のようなかんじになっています。 Private Sub CommandButton1_Click()   Sum = 0  For N = 1 To 2  If Controls("TextBox" & N).Text = "" Then   RepMsg = MsgBox("値を入力して下さい。", vbOKOnly + vbExclamation, "入力確認")   『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』  Else   Sum = Val(Controls("TextBox" & N).Text) + Sum  End If  Next N  If Val(TextBox1.Text) <> Sum Then   RepMsg = MsgBox("合計が一致しません。", vbOKOnly + vbExclamation, "合計確認")   If RepMsg = vbOK Then    『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』   End If  End If ( 表示 ) End Sub

  • エクセル2003のVBAで、ユーザーフォームにあるテキストボックスに入力制限をつけたいのですが

    エクセル2003のVBAで、ユーザーフォーム上にあるテキストボックスに入力制限をつけようとしています。 エクセルのセル13列目にdeg値 0 0.5 1 1.5 2 ・ ・ ・ があります。 ここにない値を入力するとエラーメッセージを表示させます。 下記のコードで、小数点を入力した瞬間(例えば「1.」)にエラーメッセージが表示されてしまいます。 どう修正したらよいか、どなたか分かりませんでしょうか? よろしくお願いいたします。 Private Sub TextBox21_Change() For i = 7 To 1446 If TextBox21.Value = ThisWorkbook.Sheets(\"default\").Cells(i, 13).Value Then Exit For Next i If i = 1447 Then MsgBox \"deg値と一致しません。補正値を入れなおしてください。\" TextBox21.Text = \"\" End If End Sub

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • エクセル VBA MsgBox

    1)下記の記述だと コンボが空白ならエラー表示が出て Okをクリックすると ”記録しますか?” となります! そこをエラー表示されたら UserFormに戻り 空白が無くなったら ”記録しますか?” というMegBoxにしたいのですが どう変化すれば良いのでしょうか? 教えて下さい! Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 If Controls("ComboBox" & i).Text = "" Then MsgBox "選択されていません確認して下さい!", vbInformation, "良く見て下さい!" Exit For End If Next If MsgBox("記録しますか?", vbOKCancel) = vbOK Then With UesrForm From.TextBox1 = Val(UesrFrom.ComboBox1) + _ Val(UesrFrom.ComboBox2) + Val(UesrFrom.ComboBox3) + _ Val(UesrFrom.ComboBox4) + Val(UesrFrom.ComboBox5) From.TextBox2 = Val(UesrFrom.ComboBox6) + _ Val(UesrFrom.ComboBox7) + Val(UesrFrom.ComboBox8) + _ Val(UesrFrom.ComboBox9) + Val(UesrFrom.ComboBox10) End With MsgBox " 記録します!" Unload Me Else MsgBox " キャンセル!!" End If End Sub

  • ユーザーフォーム データ消去の時の処理

    環境:Excel2002です ユーザーフォームのテキストボックスの入力チェックをしています Rem**************** Rem TextBox5 Check Rem**************** Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub 入力したデータを消去して Enterキーを押すか、マウスでクリックした時のいずれでも Len(Me.TextBox5.Text) = 0 と認知されて "数値で入力してください"のメッセージが表示されてしまいます このメッセージが出ないようにするにはどうしたらいいのでしょうか ご教示願います

  • ifでの条件分岐

    .net vb2005でプログラミングしています。 2つのテキストボックスがあり、その名前をtextbox1,textbox2 , 変数の代入をtx1、tx2とします。 どちらも半角数字で300までしか入力できません。 さらに、tx1に入力されるとtx2も必ず入力される必要があります。 tx1が未入力の場合はtx2も未入力である必要があります。 最初にtx1の文字数が0か確認し、入っている場合、居ない場合と ifで条件分岐させましたが うまくいきません。。 アドバイスいただきたいと思います。 Dim tx1,tex2 As Integer If Len(TextBox1.Text) = 0 Then flg = 0 ElseIf Regex.IsMatch(TextBox1.Text, "^[0-9]{1,3}$") Then tx1= Val(TextBox1.Text) tx1 = Convert.ToInt32(iptx5) '文字列をInteger型(数字型)に変換 Else MsgBox("300までの数字で入力して下さい", vbCritical, "入力エラー") TextBox1.Clear() Exit Sub End If If tx1 > 255 Then flg = 1 MsgBox(ipm_msg2, vbCritical, "入力エラー") TextBox1.Clear() End If '********************************************************************** If Len(TextBox1.Text) = 0 Then flg = 0 exit sub ElseIf Regex.IsMatch(TextBox2.Text, "^[0-9]{1,3}$") Then tx2 = Val(TextBox2.Text) tx2 = Convert.ToInt32(tex2) Else MsgBox(ipm_msg1, vbCritical, "入力エラー") TextBox2.Clear() Exit Sub End If '**255以上なら入力不可** If iptx6 > 255 Then flg = 1 MsgBox(ipm_msg2, vbCritical, "入力エラー") TextBox6.Clear() Exit Sub End If

  • Excel VBA SetFocus

    環境:Excel 2002です UserForm1での質問です Flame5にTextBox14とTextBox15があります TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後 Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します 実行時エラー 2147467259(800004005) 異なるFlameにSetFocusする方法があるのでしょうか? Flame5の中でTextBox14及びTextBox15のSetFocusはできます TextBox14とのTextBox15のBeforeUpdateのプロシージャです Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox14.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox14.Text) Me.TextBox15.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If Me.TextBox1.SetFocus End Sub Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox15.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox15.Text) Me.TextBox14.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If UserForm1.TextBox1.SetFocus End Sub ご支援願います

  • エクセル VBA ID入力について

    TextBox2に数字をIDを入力して 名前をComboBox1.Text に表示させるようにしました。 しかし、数字入力すると認識される物もあるのですが 表示されない=数字の値は同じ数字 なぜなのでしょうか? Private Sub TextBox2_Change() Dim vRet As Variant vRet = Application.VLookup(TextBox2.Text, _ Sheets("マスタ").Range("A:B"), _ 2, _ False) If VarType(vRet) <> vbError Then ComboBox1.Text = vRet Else ComboBox1.Text = "<< 該当なし >>" End If End Sub Private Sub UserForm_Initialize() With TextBox2 .SetFocus .Text = "ID入力"  .SelLength = Len(.Text) End With 教えて下さい!Sheet2の数字の書式が問題なのでしょうか?

専門家に質問してみよう