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