为什么在Excel比较1 <或比较任何数字与任何文字与<结果为真?

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

这背后的理由是什么? 有logging吗?

我首先想到的是,Excel内部将数字转换为string,然后比较string,但是:

'129 < '11a = false – 当左边部分被input为文本

129 < '11a = true – 当左边部分作为数字input时

在VBA中, varianttypes比较的工作方式与电子表格中的相同

 Sub CompareNumberAndText() Dim a, b, c at = "129" an = 129 b = "11a" ct = at < b 'false cn = an < b 'true End Sub 

我正在开发一个类似于Excel单元格的types的库,并希望尽可能使行为尽可能接近Excel,但这些Excel比较结果是违反直觉的。 在这种情况下,我会抛出一个错误或返回false。

我可以想象一个假设的情况,当在专栏AI计算一些价值除以两个数字,例如市盈率,但负EI放在“nm”。 然后在BI列中检查P / E> some_value,我会在na上得到结果。如果练习是find昂贵的股票,那么显示负收益的股票会使一些(但是很less)感觉到,有20只股票的时候一个一个的分析。 但如果有2000个,我计算一些总量,这可能会被忽视。

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

根据这个at < b的string比较,第一个字符1的ASCII值是49atb是相同的,但是第二个字符的ASCII值大于1的ASCII值,因此expression式at < b返回false

同样如比较运算符(Visual Basic)中更详细解释的那样,如果您定义了variables的基本types,那么行为会发生变化,请参阅下文

情况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中,stringbc被转换为double,然后与an的值进行比较,并得到适当的布尔值,但是在情况-2中,程序无法将variablesb转换为double值,抛出错误Run Time Error - 13, Type Mismatch

复制Excel对待比较的方式并不是一件简单的事情 – 您需要调查Unicode整理序列和区域设置。 有关这个问题的一些讨论,请参阅这篇博客文章,了解如何对Excel进行sorting和比较