VBA:试图比较价值似乎随机结果

我正在研究VBA中所谓的简单function,但是我坚持不懈。 我有一个单元格的值可以从0到100之间的任何值。通过一个简单的“If”语句,它应该过滤出10或10以下的值。如果一个值没有被过滤掉,整个行被复制到不同的工作表。

这是我有:

For r = LastRow To 2 Step -1 If Range("H" & r).value > "10" And Range("H" & r).value < "100" Then Rows(r).Copy Destination:=Worksheets("Funnel").Range("A" & LastRowDestination) LastRowDestination = LastRowDestination + 1 End If Next r 

但是,比较似乎只在某些情况下才起作用。 这个声明似乎很好:

 If Range("H" & r).value > "10" Then 

这个问题出现在我介绍比较小的时候。 它将复制正确的行(比如所有的值都小于80,如果我将它与80比较),而且它将复制值为100的行。大于语句仍按预期工作,过滤出值那太小了。

尽pipe如下比较,没有行被复制:

 If Range("H" & r).value > "10" AND Range("H" & r).value < "100" Then 

通过这个比较,具有值0或10的行被复制:

 If Range("H" & r).value < "100" Then 

似乎有一种模式,但我不能理解为什么这种情况正在发生。 任何build议来解决这个表示赞赏。

通过使用"10"而不是10来比较string。 按字母顺序发生,就像在字典中一样。 所以例如

 "1" < "2" < "20" < "3" < "34593045983049580" < "4" 

这是一个closures的调用,因为VBA会转换variables,如果你试图比较它们。 如果您尝试将一个数字与一个string进行比较,它会尝试将该string转换为一个数字:

 ?"2"<"10" False ?2<"10" True ?"2"<"a" True ?2<"a" *type mismatch* 

正如你所看到的,它将string"10"转换为第二个例子中的整数10 ,同样可以将2转换为"2" 。 我想这是有道理的,因为显然比string更常用来比较数字。

在最后一个例子中,它试图将"a"转换为一个不起作用的整数,所以你得到错误。

在你的情况下,你把一个单元格的Value与一个string进行比较,所以结果取决于如果Value被转换为一个string或数字。 显然它决定,因为你是比较它的string,你希望它是一个string。

这里是一个testing子:

 Sub testStringComparison() Dim dbl As Double Dim str As String Dim var As Variant dbl = Cells(1, 1).Value 'Cell contains 10 str = Cells(1, 1).Value var = Cells(1, 1).Value 'Comparison for double Debug.Print dbl < "2" '-> False Debug.Print dbl < "2" '->False 'Comparison for string Debug.Print str < "2" '-> True Debug.Print str < 2 '->False 'Comparison for variant Debug.Print TypeName(var) '->Double Debug.Print var < "2" '->True Debug.Print var < 2 '->False Debug.Print CDbl(var) < "2" '->False End Sub 

双string和stringvariables的行为是预期的(如果有两个string,然后比较string,如果有一个数值variables,然后将其他转换为数字)。 虽然变体types的行为有点奇怪,但因为虽然它的types显示为Double ,但与string进行比较时它仍然被转换为string。 当然,如果你比较这些variables中的两个,他们会被再次视为数字。


结论:如果您避免与显式string的variables进行比较,那么您就很好。