2016-06-28 2 views
1

私はVBAで単純に機能するようになっていますが、スタックしています。 セル内に0から100までの任意の値を持つことができる値があります。単純な "If"ステートメントでは、10以下の値と100の値を除外することになっています。行全体が別のシートにコピーされます。VBA:値を比較しようとすると無作為に結果が返される

は、ここで私が持っているものです。

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の値を持つ行がコピーされます。greater thanステートメントは期待どおりに機能し、値を除外しますそれは小さすぎる。次の比較で

しかし、何行がコピーされません:

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

そして、この比較で、0または10の値を持つ行がコピーされます:

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

があるようですパターンはありますが、なぜこれが起きているのかを後ろから知ることはできません。これを解決するための提案は感謝しています。

+3

引用符を付けずに試してください。 – arcadeprecinct

+2

引用符を使用すると、セルの値と文字列を比較しています。それらを削除すると、セルの値と数値を比較しています。 < and >などのタイプの操作の場合は、使用する数値です。 – Dave

+1

さて、それは私のところではばかげていました。みんなありがとう - 問題解決! – curzic

答えて

1

10の代わりに"10"を使用すると、文字列を比較しています。これは辞書のようにアルファベット順に行われます。あなたがそれらを比較しようとするとVBAの変数に変換しますので、ですから、例えば

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

のためにそれはしかし危機一髪です。あなたはときに全く同じように、それは第二の例では、整数10に文字列"10"を変換見ることができるように

?"2"<"10" 
False 

?2<"10" 
True 

?"2"<"a" 
True 

?2<"a" 
*type mismatch* 

:あなたは、文字列と数を比較しようとした場合、それは文字列を数値に変換しようとします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 

予想通り、ダブル、文字列変数の挙動である(2つの文字列がある場合、その後の文字列を比較し、ある数値変数がある場合、その後数に他の変換します同じように)。バリアント型は、その型がDoubleとして表示されますが、それでも文字列と比較しても文字列に変換されるため、奇妙な動作をします。これら2つの変数を比較するならばもちろん、彼らは再び数値として扱うます...


結論:あなたが明示的な文字列である変数に比較することを避ける場合は、あなたが行ってもいいです。

関連する問題