我有一个vba函数,用于检查来自文本框的用户输入是否为正整数。下面的代码:
Public Function IsPosInteger(n As Variant) As Boolean
If IsNumeric(n) = True Then
If (n = Int(n)) And n > 0 Then
IsPosInteger = True
Else
IsPosInteger = False
End If
Else
IsPosInteger = False
End If
End Function
问题在于测试后,该函数对于有效的正整数仍然返回false。经过进一步调查,我注意到默认情况下,texbox值的变量类型为String。 IsNumeric可能返回false的主要原因。
下面的函数是我用来确定变量类型的函数。
TypeName(n)
答案 0 :(得分:1)
Public Function IsPosInteger(s As String) As Boolean 'boolean data type is false by default.
If (IsNumeric(s) = False) Then Exit Function
If (s < 1) Then Exit Function
If (InStr(s, ".") = False) Then IsPosInteger = True
End Function
该功能测试输入是数字,不小于1,并且不包含小数。这是一个如何在调用子程序中使用它的示例:
Sub TestInput()
Dim sUserInput As String
Dim boolPositiveInt As Boolean
Dim i As Integer
sUserInput = Range("A1").Value2
boolPositiveInt = IsPosInteger(sUserInput)
If (boolPositiveInt = False) Then
MsgBox "Invalid input. Please enter a positive integer"
Exit Sub
End If
i = CInt(sUserInput)
'continue working with integer variable here
End Sub
答案 1 :(得分:0)
这对我有用。
我使用了一个包含以下内容的输入框:
Public Function IsPosInteger(n As Variant) As Boolean
If n > 0 And IsNumeric(n) Then IsPosInteger = True
End Function
现在,另一个问题可能是,由于输入框的性质,值n
在技术上仍为 String 类型-即使它通过了此功能的测试。 如果您想更改此行为,请继续阅读。
为此,请确保您使用的是ByRef
(当这是故意时,我通常会在参数上键入ByRef
,即使它是VBA自动假定,如果传递给函数的任何参数未明确声明为ByRef
,则为ByVal
。
如果这是您想要的结果,则可以使用此功能:
Public Function IsPosInteger(ByRef n As Variant) As Boolean
If n > 0 And IsNumeric(n) Then
IsPosInteger = True
n = clng(n) '<-- This converts the variant (currently a string) n to type long,
' only if it passes the test
end if
End Function
您必须确保调用例程中的n
类型为Variant
,否则您将遇到错误。