• ベストアンサー

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

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

  • ベストアンサー
  • 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