VBA:试图比较值似乎给出了随机结果

时间:2016-06-28 09:00:33

标签: excel vba excel-vba

我正在研究VBA中一个所谓的简单功能但是卡住了。 我在单元格中有一个值,可以有0到100之间的任何值。使用简单的“If”语句,它应该过滤掉10或10以下的值和100的值。如果没有过滤掉一个值,则整个行被复制到另一张表。

这就是我所拥有的:

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的行。大于语句仍然按预期工作,过滤掉值太小了。

但是,通过以下比较,不会复制任何行:

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

通过此比较,将复制值为0或10的行:

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

似乎有一种模式,但我不能落后为什么会发生这种情况。任何解决此问题的建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用"10"代替10,您正在比较字符串。这种情况按字母顺序排列,就像字典一样。例如,

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

这是一个近距离通话,因为如果您尝试比较它们,VBA将转换变量。如果您尝试将数字与字符串进行比较,它会尝试将字符串转换为数字:

?"2"<"10"
False

?2<"10"
True

?"2"<"a"
True

?2<"a"
*type mismatch*

正如您所看到的,它在第二个示例中将字符串"10"转换为整数10,同时它也可以将2转换为"2"。我认为这是有道理的,因为<显然更常用于比较数字而不是字符串。

在上一个示例中,它尝试将"a"转换为不起作用的整数,以便您得到错误。

在您的情况下,您将单元格的Value与字符串进行比较,因此结果取决于Value是否被转换为字符串或数字。显然它决定因为你将它与一个字符串进行比较,你希望它是一个字符串。

这是一个测试子:

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

double和string变量的行为符合预期(如果有两个字符串则比较字符串,如果有一个数字变量,则将另一个转换为数字)。变体类型的行为有点奇怪,因为尽管它的类型显示为Double,但它仍然会在转换为字符串时转换为字符串。当然,如果你比较其中两个变量,它们会再次被视为数字......

结论:如果你避免与显式字符串的变量进行比较,你就可以了。