【问题标题】:IF returns FALSE when it sould return TRUEIF 在应该返回 TRUE 时返回 FALSE
【发布时间】:2019-03-29 09:55:04
【问题描述】:

我试图做这样的事情

sub test()
a=inputbox("value1:")
b=inputbox("value2:")
c=inputbox("value3:")

  if a<b and a>c then 

    msgbox(a)

    else
      msgbox(b)
      msgbox(c)
   end if

end sub 

当我为 a 输入 5、为 b 输入 10 和为 c 输入 2 等值时,条件应返回 TRUE,然后显示带有 a 的消息框,但它返回 FALSE 并显示带有 b 和 c 的消息框。我认为解决方案非常简单,但我无法弄清楚。

非常感谢

【问题讨论】:

  • 使用 a=CLng(inputbox("value1:")) 等将字符串转换为长整数(如果您希望不是整数值,则使用 CDbl())
  • 变量有哪些类型?您应该养成使用Dim 声明它们的习惯。使用Option Explicit 强迫自己这样做。如果您已将它们声明为数字类型,那么这将不是问题。

标签: excel vba conditional-statements


【解决方案1】:

您的 InputBox 正在返回看起来像数字的字符串,并且 "5" 不小于 "10"。执行以下操作之一:

  • Dim a as long, b as long, c as long
  • Application.InputBox 与 Type:=1 参数一起使用。
  • 将字符串转换为实数,例如a=clng(inputbox("value1:"))if int(a)&lt;int(b) and int(a)&gt;int(c) then

【讨论】:

    【解决方案2】:

    这是因为 VBA 将您的输入视为字符串。只需在变量中添加 CInt() 或 CLng() 即可知道它们是数字的。

    Sub test()
    
    a = CInt(InputBox("value1:"))
    b = CInt(InputBox("value2:"))
    c = CInt(InputBox("value3:"))
    
      If a < b And a > c Then
        MsgBox (a)
    
        Else
          MsgBox (b)
          MsgBox (c)
       End If
    End Sub
    

    【讨论】:

      【解决方案3】:

      其他两个答案非常好,我会最终使用 Jeeped 的显式变量声明方法 (Dim a as long, b as long, c as long)。

      虽然我从不建议不声明变量——你发现这样做总是好的做法——你也可以简单地将输入框乘以 1。

      这只是使用乘法的幂将字符串强制为数值的另一个技巧(这是在工作表公式中使用的类似技巧,使用双负--() 将值转换为数字)。

      a = InputBox("value1:") * 1
      b = InputBox("value2:") * 1
      c = InputBox("value3:") * 1
      
      If a < b And a > c Then
      
          MsgBox (a)
      
      Else
      
          MsgBox (b)
          MsgBox (c)
      
      End If
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多