Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何验证2个变量是否为整数类型?_Excel_Vba_Types_Integer - Fatal编程技术网

Excel 如何验证2个变量是否为整数类型?

Excel 如何验证2个变量是否为整数类型?,excel,vba,types,integer,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 !") U

我想让用户输入两个整数(两个文本框) 当这个条件不满足时,我想让用户再次填充文本框

以下是我尝试过的,但不是正确的答案:

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

提前感谢。

每次从文本框中读取都可能返回字符串。因此,对于整数检查,请确保数字是数字,并且没有
。为了确保它是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更容易编写)。如果它不是
整数
,则再次调用它。遵循一些类似的逻辑来构建您的案例。

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

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
而您的“主要”调用代码可能是:

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

首先,检查文本框的内容是否可以使用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

根据经验,我建议将有效性检查放在文本框上的更改事件内,并使用包含状态消息的文本框或标签向用户反馈

如果输入的变量类型不正确,代码将递归调用自身。这将产生一个无休止的循环

从逻辑上讲,任何验证函数都应该返回一个简单的“是”或“否”。要么是经过验证,要么不是。这意味着返回一个简单的
布尔值
——这反过来意味着它应该是
函数
,而不是
子函数

并且始终使用
选项显式

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
中)


在哪里提示用户输入新值?目前,如果用户传递一个无效的值,您最终会陷入一个循环中,在该循环中您递归调用verif_type函数,您可以通过只允许文本框中的数值来阻止用户输入文本。请注意,验证应在用户表单中进行。
Integer
不是作为16位整数类型的
Double
Integer
。那么32位
类型呢?我建议使用
\u键来控制用户输入,而不是数据的后期处理@Storax共享了一个很好的链接,可以帮助您使用thtaIs
floor()
VBA函数?据我所知,它是s
WorksheetFunction
one。此外,
Val
函数可能会产生误导:在即时窗口中尝试
?Val(“1.2”)
?Val(“1,2”)
您要查找的VBA函数是,而不是
floor
。是的,修复或任何舍入函数。因此,Val()函数问题就留在这里了
n1,比如“*[!0-9]*”
可能更好<如果字符串包含区域设置中的货币符号,则代码>IsNumeric
将返回true。@Comintern-您是对的。如果你喜欢,请编辑我的答案。在一行中使用两次“=”会让你在很多地方感到讨厌。但这是VBA标记,没人关心,所以你很幸运。@Vityata,我感到很不幸,因为没有得到任何反馈,只是因为没用的东西。@DisplayName你可以自己选择在周六晚上感到幸运或不幸运。@DisplayName你应该将函数的返回声明为布尔:
函数IsInteger(n1作为变量)作为布尔值,否则如果
n1
不是数字,它将返回空字符串。