【问题标题】:How to verify 2 variables are Integer type?如何验证 2 个变量是整数类型?
【发布时间】:2018-12-15 15:20:04
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 您在哪里提示用户输入新值?目前,如果用户传递了一个无效的值,你最终会陷入一个循环调用 verif_type 函数的循环
  • 您可以通过只允许文本框中的数值来阻止用户输入文本。看here
  • 验证应该在用户表单中进行。
  • Integer 不是 DoubleInteger 作为 16 位整数类型。 32 位的Long 类型呢?
  • 我建议处理_KeyPress 来控制用户输入,而不是后期处理数据。 @Storax 分享了一个很好的链接,可以帮助你解决这个问题

标签: excel vba types integer


【解决方案1】:

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

【讨论】:

  • n1 Like "*[!0-9]*" 可能会更好。如果字符串包含区域设置中的货币符号,IsNumeric 将返回 true。
  • @Comintern - 你是对的。如果您愿意,请编辑我的答案。
【解决方案2】:

您可以在转换为 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

【讨论】:

  • 在一行中使用两次“=”会让你在很多地方被讨厌。不过这是VBA标签,没人在意,所以你很幸运。
  • @Vityata,我为没有得到反馈而感到不幸,但对于无用的事情
  • 周六晚上感觉幸运或不幸是你自己的选择。
  • @DisplayName 您应该将函数的返回声明为布尔值:Function IsInteger(n1 As Variant) As Boolean 否则如果n1 不是数字,它将返回一个空字符串。
【解决方案3】:

首先,使用 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

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

【讨论】:

  • floor() 是 VBA 函数吗?据我所知,它是WorksheetFunction 之一。此外Val 函数可能会产生误导:在即时窗口中尝试?Val("1.2")?Val("1,2")
  • 您要查找的 VBA 函数是 Fix,而不是 floor
  • 是的,修复,或任何舍入函数。
  • 所以 Val() 函数问题就解决了
【解决方案4】:

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

从逻辑上讲,任何验证函数都应返回简单的“是”或“否”。要么已验证,要么未验证。这意味着返回一个简单的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多