4

Excel1234 > qwer = falseでは、しかし1234 < qwer = true. C# で null 許容型を扱ったことがあるので、false値を null と比較するときのように、両方のステートメントが返されることを期待しています。

その背後にある理論的根拠は何ですか?それはどこかに文書化されていますか?

私が最初に考えたのは、Excel は内部的に数値を文字列に変換してから文字列を比較するということでしたが、次のようになります。

'129 < '11a = false- 左部分をテキストで入力した場合

129 < '11a = true・左部分を数字で入力した場合

VBAvariantでの型比較は、スプレッドシートと同じように機能します

Sub CompareNumberAndText()
    Dim a, b, c

    at = "129"
    an = 129
    b = "11a"
    ct = at < b 'false
    cn = an < b 'true
End Sub

私は Excel セルに似た型のライブラリを開発しており、動作をできるだけ Excel に近づけたいと考えていましたが、これらの Excel の比較結果は直感に反しています。この場合、エラーをスローするか、false を返します。

列 AI で 2 つの数値 (たとえば P/E 比) を割って何らかの値を計算する仮想的な状況を想像できますが、負の EI の場合は「nm」と入力します。次に、BI 列で、P/E > some_value の場合、na の場合は true になります。演習が高価な株を見つけることである場合、収益がマイナスのものを表示することは、ある程度の (しかしほとんど) 意味がなく、さらに手動で行うのに役立つ可能性があります。 20株の場合は1株ずつ分析。しかし、2000 のものがあり、いくつかの集計を計算すると、これは見過ごされる可能性があります。

4

2 に答える 2

2

比較演算子を使用した文字列の比較を参照できます

これによると、文字列の比較at < bでは、最初の文字の ASCII 値1はと49で同じですが、2 番目の文字の ASCII 値は の ASCII 値よりも大きいため、式は戻りますatb21at < bfalse

また、比較演算子 (Visual Basic)で詳しく説明されているように、変数のプリミティブ型を定義すると、動作が変更されます。以下を参照してください。

ケース-1:

Sub CompareNumberAndText()
    Dim at As String, b As String, c As String, an As Integer

    at = "120"
    an = 2
    b = "1"
    c = "3"
    ct = at < b 'false
    cn = an < b 'false
    kl = an < c 'true
End Sub

ケース-2:

Sub CompareNumberAndText()
    Dim at As String, b As String, an As Integer

    at = "120"
    an = 2
    b = "1a"
    ct = at < b 'false
    cn = an < b 'error
End Sub

上記のケース 1 では、文字列bcが double に変換され、 の値と比較されan、結果として適切なブール値になりますが、ケース 2 では、プログラムは変数bを double 値に変換できず、エラーがスローされますRun Time Error - 13, Type Mismatch

于 2013-09-08T07:44:28.303 に答える
1

Duplicating the way Excel treats comparisons is not a trivial exercise - you need to investigate Unicode collating sequences and locales. For some discussion of the problems see this blog post on sorting and comparing the Excel way

于 2013-09-09T08:04:43.920 に答える