VBA 比较运算符对大小写的评估不正确
VBA Comparison Operators Evaluating Incorrect with Case
我有一个代码块一直在错误地求值。我不知道为什么会这样。
我确定这至少与我的'Select Case'有关。如果运算符的顺序发生变化,例如=, >, <
或 <, =, >
等评价变化。
我的期望是评估将是 a = b
,如果 highest_header = 24
- 虽然 24
不可避免地分配给 highest_header
,但我的代码使用什么我认为是错误的'Case'.
我稍微简化了代码片段,但结果是一样的——比较被评估为 a = b = FALSE
和 a < 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 0
、Case Is < 0
和Case 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
我有一个代码块一直在错误地求值。我不知道为什么会这样。
我确定这至少与我的'Select Case'有关。如果运算符的顺序发生变化,例如=, >, <
或 <, =, >
等评价变化。
我的期望是评估将是 a = b
,如果 highest_header = 24
- 虽然 24
不可避免地分配给 highest_header
,但我的代码使用什么我认为是错误的'Case'.
我稍微简化了代码片段,但结果是一样的——比较被评估为 a = b = FALSE
和 a < 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 0
、Case Is < 0
和Case 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