VBA 比较运算符对大小写的评估不正确

VBA Comparison Operators Evaluating Incorrect with Case

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

我确定这至少与我的'Select Case'有关。如果运算符的顺序发生变化,例如=, >, <<, =, > 等评价变化。

我的期望是评估将是 a = b,如果 highest_header = 24 - 虽然 24 不可避免地分配给 highest_header,但我的代码使用什么我认为是错误的'Case'.

我稍微简化了代码片段,但结果是一样的——比较被评估为 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

如有任何见解,我们将不胜感激。

您的 Select 案例是将值为 0 的整数与布尔值进行比较。

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

所以这就是你在 a < b 上受到打击的原因。

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

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,等等)

或者,都可以用Select Case,稍微"trick"就可以了

你可以使用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