我正在研究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
似乎有一种模式,但我不能落后为什么会发生这种情况。任何解决此问题的建议都表示赞赏。
答案 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
,但它仍然会在转换为字符串时转换为字符串。当然,如果你比较其中两个变量,它们会再次被视为数字......
结论:如果你避免与显式字符串的变量进行比较,你就可以了。