为什么在 Excel 中比较 1<' 或将任何数字与任何文本进行比较<结果为 true

本文关键字:任何 比较 文本 数字 true 结果 Excel 为什么 | 更新日期: 2023-09-27 18:30:29

在 Excel 1234 > qwer = false 中,但1234 < qwer = true .在 C# 中使用可为空的类型后,我希望这两个语句都返回false就像将值与 null 进行比较时一样。

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

我的第一个想法是 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 个并且我计算了一些总数,这可能会被忽视。

为什么在 Excel 中比较 1<' 或将任何数字与任何文本进行比较<结果为 true

您可以参考 使用比较运算符比较字符串

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

此外,正如比较运算符 (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
在上面的 Case-1 中,

字符串bc 被转换为双精度值,然后与 an 的值进行比较,结果会产生正确的布尔值,但是在 Case-2 中,程序无法将变量b转换为双精度值并抛出错误Run Time Error - 13, Type Mismatch

复制 Excel 处理比较的方式并非易事 - 您需要调查 Unicode 整理序列和区域设置。有关问题的一些讨论,请参阅这篇关于排序和比较 Excel 方法的博客文章