为什么在Excel中比较1<'或者将任何数字与任何文本进行比较<结果是真的吗?

时间:2013-09-07 22:22:23

标签: c# excel vba nullable

在Excel 1234 > qwer = false中,但1234 < qwer = true。在C#中使用可空类型之后,我希望两个语句在将值与空值进行比较时返回false

背后的理由是什么?它是在某处记录的吗?

我的第一个想法是Excel内部将数字转换为字符串,然后比较字符串,然后:

'129 < '11a = false - 左侧部分作为文字输入

129 < '11a = true - 当左侧部分作为数字输入时

在VBA中variant类型比较的工作方式与电子表格相同

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。

我可以想象一个假设的情况,当在A列中我通过除以两个数来计算某个值,例如:市盈率,但对于负E,我把“n.m.”。然后在列B中检查P / E是否> some_value,我会为n.a.如果这项工作是寻找昂贵的股票,那么显示负收益的股票会产生一些(但很少)的意义,并且当有20只股票时,可以用于进一步手动逐一分析。但如果有2000个并且我计算了一些聚合,那么这可能会被忽视。

2 个答案:

答案 0 :(得分:1)

您可以参考Comparing Strings by Using Comparison Operators

根据您的字符串比较at < b,第一个字符1的ASCII值为49atb的ASCII值相同,但是对于第二个字符,2的ASCII值大于1的ASCII值,因此表达式at < b返回false

同样如Comparison Operators (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的值进行比较,结果产生了正确的布尔值,但是在Case中-2程序无法将变量b转换为double值并抛出错误Run Time Error - 13, Type Mismatch

答案 1 :(得分:1)

复制Excel处理比较的方式并非易事 - 您需要调查Unicode整理顺序和区域设置。有关问题的一些讨论,请参阅this blog post on sorting and comparing the Excel way