在Excel VBA中设置默认TextBox.Value TypeName

时间:2018-08-27 23:45:12

标签: vba excel-vba

我有一个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)

2 个答案:

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

这对我有用。

我使用了一个包含以下内容的输入框:

  • 字符串(假)
  • 负数(假)
  • 正数(true)
  • 正数和字母(假)

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,否则您将遇到错误。