こんばんは。
どのイベントをお使いかわかりませんが、期待値以外の入力をアラート表示
するよりは、いっそ入力自体を阻止する方がストレスの無い仕様かも。
ということで、別案を提案します。
もし 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