Excel 防止小数的VBA输入框

Excel 防止小数的VBA输入框,excel,vba,Excel,Vba,我正在尝试开发一种工具,帮助标准化产品描述目录。我希望有一个输入框提示用户输入尺寸。我希望鼓励像“5-1/2”这样的大小输入,并防止用户输入“5.5”。理想情况下,如果输入的大小是十进制的,而不是带分数的破折号,我希望弹出一个消息框,告诉他们不能这样做。然后需要重新显示输入框 这是我所拥有的- Private Sub CS_Other_Click() Unload Me Sheets("Fill In").Activate Worksheets("Fill In").Range("C2").Nu

我正在尝试开发一种工具,帮助标准化产品描述目录。我希望有一个输入框提示用户输入尺寸。我希望鼓励像“5-1/2”这样的大小输入,并防止用户输入“5.5”。理想情况下,如果输入的大小是十进制的,而不是带分数的破折号,我希望弹出一个消息框,告诉他们不能这样做。然后需要重新显示输入框

这是我所拥有的-

Private Sub CS_Other_Click()
Unload Me
Sheets("Fill In").Activate
Worksheets("Fill In").Range("C2").NumberFormat = "@"
Dim other_casing_size As Variant
other_casing_size = InputBox("Fill in the casing size. Syntax MUST be in the form of X-X/X", "New Casing Size")
Range("C2") = other_casing_size
我只是不知道防止输入小数的代码。更好的是,如果我知道如何编写一个精确的语法来包含或排除任何我想要的东西,那将是完美的


感谢while循环,它检查输入字符串中的点或逗号,我想这样可以:

Sub TestMe()

    Dim inputString As String
    Dim inputNumeric As Boolean

    inputString = InputBox("Please, enter a number!")
    inputNumeric = isNumeric(Evaluate(inputString))

    Do While InStr(1, inputString, ".") Or _
            InStr(1, inputString, ",") Or _
            Not inputNumeric

        If Not CBool(inputNumeric) Then
            MsgBox "You tried to cancel or entered empty value!"
            Exit Do
        End If

        MsgBox "Please, do not write dot or comma!"

        inputString = InputBox("Please, enter a number!")
        inputNumeric = isNumeric(Evaluate(inputString))
    Loop

End Sub
isNumeric()
检查输入是否能够转换为数字。因此
5-1/2
应该可以


关于从
InputBox()
中取消或输入空值-这实际上取决于“应用程序”的业务逻辑,但在上述情况下-有一个msgbox,它退出循环。

编写一个单独的函数负责该提示,并使用它,例如:

Dim casingSize As String
If GetCasingSize(casingSize) Then
    ActiveSheet.Range("C2").Value = casingSize
End If
Public Function GetCasingSize(ByRef outResult As String) As Boolean
    Do            
        Dim raw As Variant
        raw = InputBox("Casing size?")
        If VarType(raw) = vbBoolean Then
            'handle cancelled prompt:
            Exit Do
        End If

        If ValidateFractional(raw) Then
            'handle valid input:
            outResult = CStr(raw)
            GetCasingSize = True
            Exit Do
        End If

        'handle invalid input:
        If MsgBox("The value '" & raw & "' is not valid. Try again?", vbYesNo) = vbNo Then
            Exit Do
        End If
    Loop
End Function
该函数需要返回一个
布尔值
,才能工作-如果输入有效,则返回
;如果没有有效输入,则返回
(例如,取消提示)。这样做的原因是将结果作为
ByRef
参数传递,如下所示:

Dim casingSize As String
If GetCasingSize(casingSize) Then
    ActiveSheet.Range("C2").Value = casingSize
End If
Public Function GetCasingSize(ByRef outResult As String) As Boolean
    Do            
        Dim raw As Variant
        raw = InputBox("Casing size?")
        If VarType(raw) = vbBoolean Then
            'handle cancelled prompt:
            Exit Do
        End If

        If ValidateFractional(raw) Then
            'handle valid input:
            outResult = CStr(raw)
            GetCasingSize = True
            Exit Do
        End If

        'handle invalid input:
        If MsgBox("The value '" & raw & "' is not valid. Try again?", vbYesNo) = vbNo Then
            Exit Do
        End If
    Loop
End Function
注意,
validateActional
函数是它自己关心的问题-一个单独的,
Private
函数可以工作,但我建议将它设置为公共的,并且,为了确保它在各种各样的边缘情况输入下都能按预期工作——如果需要微调验证,那么将它放在一个单独的函数中意味着
GetCasingSize
中的逻辑不需要更改;例如,这个简单的实现使用了
Like
操作符,可以用于
5-1/4
,但不适用于例如
15-5/8

Public Function ValidateFractional(ByVal value As String) As Boolean
    ValidateFractional = value Like "#[-]#/#"
End Function

为此使用正则表达式可能是一个好主意。

考虑制作一个
用户表单
,这样您可以更好、更精确地控制用户在
文本框
控件中可以输入和不能输入的内容(例如通过
按键
处理程序)而在
输入框
-中,您可以在提交输入之前验证输入,因此无效输入会使“确定”按钮被禁用,并显示解释性验证错误消息。如果使用类型为2的
应用程序.InputBox
,您的输出将是字符串。然后,您可以使用正则表达式来测试您是否具有所需的格式。或者,您可以只将十进制输入转换为小数,并取消对输入类型的限制。还有一件事:每当使用
InputBox
Application.InputBox
时,可以取消输入框的事实总是被系统地忽略,直到它成为一个问题(通常涉及类型不匹配错误)。函数返回一个
变量
,如果取消,该变量将是一个
布尔值
,您需要对此进行说明;您可以使用
VarType
获取
变量的子类型
;如果这是
vbBoolean
,则框被取消,并且不应使用函数的返回值。并通过使用
Exit Do
…跳出循环来处理取消操作,但您不能使用不推荐的
While…Wend
循环块;使用
Do While…Loop
。@MathieuGuindon-谢谢,Mathieu。取消和空值是两个独立的问题,但我想可以通过
Exit Do
很好地处理它们。