如何在文本框中允许双精度数据类型?

时间:2019-06-28 06:26:06

标签: excel vba

我有一个用户窗体,用户应在其中将零件的测量尺寸(质量管理字段)输入复选框。这意味着不允许输入文本,也不能输入任何随机数字,只能输入数字。

我现在所拥有的是这个

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

2 个答案:

答案 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