VBA:如何验证2个变量是Integer类型?

时间:2018-12-15 15:20:04

标签: excel vba excel-vba types integer

我想让用户输入两个整数(两个文本框) 虽然不满足此条件,但我想让用户再次填写文本框。

这是我尝试过的方法,但这不是正确的答案:

Sub verif_type(n1, n2)


    If TypeName(n1) = "Integer" And TypeName(n2) = "Integer" Then
        MsgBox ("C'est bon !")

    Else
        MsgBox ("C'est pas bon, recommencez !")
        Unload UserForm1
        Call verif_type(n1, n2)
    End If

End Sub

谢谢。

4 个答案:

答案 0 :(得分:0)

从文本框中读取数据很可能每次都会返回一个字符串。因此,对于整数检查,请确保该数字是数字并且其中没有,.。为了确保它是VBA整数,您可能还会看到它是否在-32768到32767的边界内。

Option Explicit

Sub TestMe()

    verifType InputBox("Please enter value")

End Sub

Sub verifType(n1)

    If IsNumeric(n1) _
            And InStr(1, n1, ",") = 0 _
            And InStr(1, n1, ".") = 0 Then

        Debug.Print "Numeric!"
    Else
        Debug.Print "Not Numeric!"
        TestMe
    End If

End Sub

上面的代码通过TestMe()调用,并且仅获得一个变量(比2容易写)。如果不是Integer,则会再次调用它。遵循一些类似的逻辑来建立案例。

答案 1 :(得分:0)

您可以在转换为Long之前和之后检查字符串的长度:

Function IsInteger(n1 As Variant)
    If IsNumeric(n1) Then IsInteger = Len(n1) = Len(CStr(CLng(n1)))
End Function

因此您的UserForm1按钮点击事件代码可能是:

Private Sub CommandButton1_Click() ' change "CommandButton1" to your actual command button name
    If IsInteger(Me.TextBox1) And IsInteger(Me.TextBox2) Then
        MsgBox ("C'est bon !")
        Me.Hide
    Else
        MsgBox ("C'est pas bon, recommencez !")
    End If
End Sub

“主”调用代码可能是:

Sub main()

    ...

    With New UserForm1
        ...
        (possible code to pre-set UserForm1 controls to show to user)
        ...

        .Show

        ...
        (code to exploit UserForm1 controls values after user interaction)
        ...

    End With

    ...

End Sub

答案 2 :(得分:0)

首先,检查文本框的内容可以使用IsNumeric解释为数字 其次,检查这些内容的值等于这些内容的舍入值

if IsNumeric(n1) then
       if val(n1) = floor(val(n1)) then
              ' number is good, take appropriate action
       else
              ' Inform user and take appropriate action
       end if
else 
       'Inform user and take appropriate action
end if

根据经验,我建议将有效性检查放在文本框上的change事件中,然后使用包含状态消息的文本框或标签将其反馈给用户。

答案 3 :(得分:0)

如果输入的变量类型不正确,您的代码将递归调用自身。这将创建一个无限循环。

逻辑上,任何验证功能都应返回简单的“是”或“否”。它要么被验证,要么未被验证。这意味着返回一个简单的Boolean-这反过来意味着它应该是Function而不是Sub

并且 总是 使用Option Explicit

Function verif_type(n1 as Variant, n2 as Variant) as Boolean
    If TypeName(n1) = "Integer" And TypeName(n2) = "Integer" Then
        verif_type = True
        'MsgBox ("C'est bon !")
    Else
        verif_type = False
        'MsgBox ("C'est pas bon, recommencez !")
        'Unload UserForm1
        'Call verif_type(n1, n2)
    End If
End Function

但这本身可以进一步简化为

Function verif_type(n1 as Variant, n2 as Variant) as Boolean
    verif_type = TypeName(n1) = "Integer" And TypeName(n2) = "Integer"
End Function

现在,您所有的响应逻辑都在您的主代码中(我假设在您的UserForm中)。

If verif_type(a,b) then
    ' Do something
Else
    ' Do something else
End If