VBA比较运算符评估不正确的案例

时间:2017-09-27 11:04:11

标签: vba comparison-operators

我的代码块一直在不正确地进行评估。我不知道为什么会这样。

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

我的期望是评估为a = b,可能发生highest_header = 24 - 虽然24不可避免地分配给highest_header,但我的代码使用我相信的方式是错的&#39;案例&#39;。

我稍微简化了代码段,但结果是相同的 - 比较正在评估为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

任何见解都将受到赞赏。

4 个答案:

答案 0 :(得分:3)

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

a = b为True,为-1, a < b为False,为0, a > b为False,为0。

这就是为什么你会受到a < b的打击。

答案 1 :(得分:3)

highest_header_count

您正在比较a = b与3次比较({{1}}等)

答案 2 :(得分:1)

您需要IF Else语句而不是Select Case。 同样在Select Case中,您使用的是错误的变量highest_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

答案 3 :(得分:1)

,您可以使用Select Case,只是“欺骗”它。

您可以使用Select Case a - b,然后查看Case 0Case Is < 0Case Is > 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