为什么在 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 个并且我计算了一些总数,这可能会被忽视。
您可以参考 使用比较运算符比较字符串
根据这个对于你的字符串比较at < b
,第一个字符1
的 ASCII 值是 49
并且对于 at
和 b
相同,但是对于第二个字符,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 中,字符串b
和 c
被转换为双精度值,然后与 an
的值进行比较,结果会产生正确的布尔值,但是在 Case-2 中,程序无法将变量b
转换为双精度值并抛出错误Run Time Error - 13, Type Mismatch
。
复制 Excel 处理比较的方式并非易事 - 您需要调查 Unicode 整理序列和区域设置。有关问题的一些讨论,请参阅这篇关于排序和比较 Excel 方法的博客文章