我有一个用户窗体,用户应在其中将零件的测量尺寸(质量管理字段)输入复选框。这意味着不允许输入文本,也不能输入任何随机数字,只能输入数字。
我现在所拥有的是这个
Private Sub TextBox25_AfterUpdate()
If Not IsNumeric(TextBox25.Value) Then
MsgBox "Invalid data!"
TextBox25.BackColor = RGB(255, 200, 200)
Cancel = True
End If
End Sub
这还不是很完美,用户仍然可以输入一些随机数字,例如09
而不是0,9
,并且不会收到任何错误消息。我相信只允许使用双类型数据是关键,但是我尝试了下面的代码,但它不起作用(无论数据类型如何,每次都会收到错误消息)。有什么想法吗?
Private Sub TextBox19_AfterUpdate()
If Not VarType(TextBox19.Value) = vbDouble Then
MsgBox "Invalid data!"
TextBox19.BackColor = RGB(255, 200, 200)
Cancel = True
End If
End Sub
答案 0 :(得分:2)
文本框的.Value
始终是String
,名称“文本框”已经包含它,它是“文本”。因此,除非您采用该Double
并将其(隐式或显式)转换为String
,否则它的类型不能为Double
。
VarType(TextBox19.Value)
将始终返回vbString
,因为它返回变量的类型而不是变量内部数据的类型。
因此,您实际上需要测试它是否为十进制(不是整数)。
唯一正确测试此方法的方法是检查String
是否恰好包含一个,
(取决于您的本地化,.
)。然后测试它是否为数字(否则它也将接受a,b
)。
Option Explicit
Public Sub TestForDecimalInput()
Dim DecimalValue As Double
Dim TextBoxValue As String
TextBoxValue = "9" 'just for testing get your text box value here: TextBoxValue = TextBox19.Value
'this replaces . and , with the actual decimal seperator of your operating system
'so the user is allowed to either enter `0,9` or `0.9`
TextBoxValue = Replace$(TextBoxValue, ".", Application.DecimalSeparator)
TextBoxValue = Replace$(TextBoxValue, ",", Application.DecimalSeparator)
'Check if there is exactly one! decimal seperator
If Len(TextBoxValue) = Len(Replace$(TextBoxValue, Application.DecimalSeparator, "")) + 1 Then
'we need to check for numeric too because yet it could be `a,b` too
If IsNumeric(TextBoxValue) Then
DecimalValue = CDbl(TextBoxValue)
End If
End If
If DecimalValue <> 0 Then
Debug.Print TextBoxValue, "->", DecimalValue
Else
Debug.Print TextBoxValue, "->", "Invalid Data"
End If
End Sub
这是某些示例输入的结果
0.9 -> 0,9
09 -> Invalid Data
0,9 -> 0,9
0,9,0 -> Invalid Data
0,0 -> Invalid Data
9,0 -> 9
9 -> Invalid Data
请注意,9,0
将被接受为输入,而9
将被视为无效。
答案 1 :(得分:1)
尝试一下。这将限制运行时的整体数量:)
'~~> Prevent anything other than numbers and decimals
Private Sub TextBox19_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyDelete, _
vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
If KeyAscii = 46 Then If InStr(1, TextBox19.Text, ".") Then KeyAscii = 0
Case Else
KeyAscii = 0
Beep
End Select
End Sub
'~~> Allow only decimals
Private Sub TextBox19_AfterUpdate()
If Int(Val(TextBox19.Value)) = TextBox19.Value And _
InStr(1, TextBox19.Value, ".") = 0 Then
MsgBox "Invalid data!"
TextBox19.BackColor = RGB(255, 200, 200)
End If
End Sub
注意:如果您不想允许9.0
,请在InStr(1, TextBox19.Value, ".") = 0
_AfterUpdate()
并且如果您想禁用诸如0x.xx
之类的输入,那么您也可以使用它
Private Sub TextBox19_AfterUpdate()
If Int(Val(TextBox19.Value)) = TextBox19.Value And _
InStr(1, TextBox19.Value, ".") = 0 Or _
(Left(TextBox19.Value, 1) = 0 And Mid(TextBox19.Value, 2, 1) <> ".") Then
MsgBox "Invalid data!"
TextBox19.BackColor = RGB(255, 200, 200)
End If
End Sub