【问题标题】:VBA Comparison Operators Evaluating Incorrect with CaseVBA比较运算符用大小写评估不正确
【发布时间】:2017-09-27 11:04:11
【问题描述】:

我有一个代码块一直在错误地评估。我不知道为什么会这样。

我已经确定这至少与我的“选择案例”有关。如果运算符的顺序发生变化,例如=, >, <<, =, > 等评估发生变化。

我的期望是评估将是a = b,可能会出现highest_header = 24 - 虽然24 不可避免地被分配给highest_header,但我的代码使用我认为错误的“案例”来执行此操作。

我稍微简化了代码 sn-p,但结果是一样的 - 比较被评估为 a = b = FALSEa < b = TRUE

Sub highest_header()
Dim highest_header_count As Integer
Dim a As Integer
Dim b As Integer

a = 24
b = 24

Debug.Print a '24
Debug.Print b '24
Debug.Print TypeName(a) 'Integer
Debug.Print TypeName(b) 'Integer

Select Case highest_header_count
    Case a = b
        highest_header_count = b
    Case a < b
        highest_header_count = b
    Case a > b
        highest_header_count = a
End Select

End Sub

任何见解将不胜感激。

【问题讨论】:

    标签: vba comparison-operators


    【解决方案1】:

    您的 Select Case 正在将值为 0 的整数与布尔值进行比较。

    a = b 为 True,即 -1, a &lt; b 为 False,即 0, a &gt; b 是 False 即 0。

    这就是你在a &lt; b 上受到欢迎的原因。

    【讨论】:

    • highest_header_count 是一个整数,Case 测试 its 值。当您将案例放在下面时,您实际上是针对转换为整数的布尔值进行测试。
    【解决方案2】:

    Option Explicit
    
    Public Sub HighestHeader()
        Dim highest_header_count As Long
        Dim a As Long
        Dim b As Long
    
        a = 24
        b = 24
    
        Debug.Print a '24
        Debug.Print b '24
        Debug.Print TypeName(a) 'Long
        Debug.Print TypeName(b) 'Long
    
        Select Case a
            Case Is = b
                highest_header_count = b
            Case Is < b
                highest_header_count = b
            Case Is > b
                highest_header_count = a
        End Select
    End Sub
    

    您正在将 highest_header_count 与 3 个比较(a = b 等)进行比较

    【讨论】:

      【解决方案3】:

      这里需要 IF Else 语句而不是 Select Case。 同样在 Select Case 中,您使用了错误的变量 high_header_count。

      Sub highest_header()
      Dim highest_header_count As Integer
      Dim a As Integer
      Dim b As Integer
      
      a = 24
      b = 24
      
      Debug.Print a '24
      Debug.Print b '24
      Debug.Print TypeName(a) 'Integer
      Debug.Print TypeName(b) 'Integer
      
      If a = b Then
          highest_header_count = b
      ElseIf a < b Then
          highest_header_count = b
      ElseIf a > b Then
          highest_header_count = a
      End If
      
      End Sub
      

      或者像这样使用你的代码...

      Sub highest_header()
      Dim highest_header_count As Integer
      Dim a As Integer
      Dim b As Integer
      
      a = 24
      b = 24
      
      Debug.Print a '24
      Debug.Print b '24
      Debug.Print TypeName(a) 'Integer
      Debug.Print TypeName(b) 'Integer
      
      Select Case True
          Case a = b
              highest_header_count = b
          Case a < b
              highest_header_count = b
          Case a > b
              highest_header_count = a
      End Select
      
      End Sub
      

      【讨论】:

      • 啊,这就是我出错的地方,主要的大脑放屁。 Select Case True vs Select Case ...no useful condition 非常感谢!
      • @NHanson 别担心,这发生在我们所有人身上。很高兴您发现它有帮助。
      • @sktneer 实际上您可以使用Select Case a - b,请参阅下面的代码。另外,前两种情况会导致相同的结果highest_header_count = b,因此您可以“合并”这两种情况
      • @ShaiRado 在这里使用案例 a-b 是无关紧要的,因为您必须根据这个单一案例评估所有其他案例。使用 True 使代码简单、易读、易懂。 :)
      • 感谢所有输入。实际上,我已经确定了一个稍微不那么冗长的解决方案,它仍然可以通过使用iif() 来满足我的用例。 a = 24, b = 24, highest_header = iif(a &lt; b, b, a)
      【解决方案4】:

      或者,你可以使用Select Case,只是“欺骗”一下。

      你可以使用Select Case a - b,然后检查Case 0Case Is &lt; 0Case Is &gt; 0,看我的代码如下:

      Sub highest_header()
      
      Dim highest_header_count As Integer
      Dim a As Integer
      Dim b As Integer
      
      a = 24
      b = 24
      
      Debug.Print a '24
      Debug.Print b '24
      Debug.Print TypeName(a) 'Integer
      Debug.Print TypeName(b) 'Integer
      
      Select Case a - b
          Case 0
              highest_header_count = b
          Case Is < 0
              highest_header_count = b
          Case Is > 0
              highest_header_count = a
      End Select
      
      End Sub
      

      您可以使Select Case 更短:

      Select Case a - b
          Case 0, Is < 0 ' <-- both scenarios lead to the same result
              highest_header_count = b      
          Case Is > 0
              highest_header_count = a
      End Select
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        相关资源
        最近更新 更多