奇怪的方式比较发生

这是奇怪的,我曾经在这里看到这个问题: 与VBA的Excel数字格式问题我想我可能展开它,看看有没有人可以解释。

可以说,我有一个Excel文档,列A有5个单元格,所有值都是1234

  • 第一个格式为格式string"000000000"
  • 第二种是使用Excel的“数字”格式进行格式化
  • 第三种格式为Excel的“常规”格式
  • 第四个被格式化为“文本”
  • 第五个格式为“文本”,但实际上是string"000001234"

因此,Excel表格看起来像这样

  A | ----------+- 000001234| 1234.00| 1234| 1234 | 000001234 | 

现在我运行下面的代码,稍微基于上面提到的问题。

 Sub test3() Dim rng As Range Dim cl As Range Set rng = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) For Each cl In rng.Cells If 1234 = "000001234" Then cl.Offset(0, 1).Value = "A" End If If 1234 = cl.Value Then cl.Offset(0, 2).Value = "B" End If If "000001234" = cl.Value Then cl.Offset(0, 3).Value = "C" End If Next cl End Sub 

输出如下

  A | B | C | D | ----------+---+---+---+- 000001234| A | B | | 1234.00| A | B | | 1234| A | B | | 1234 | A | B | | 000001234 | A | B | C | 

B栏是有道理的。 VBA可以比较string,就好像它们是数字一样,通过扩展,列C也是有意义的,在每种情况下,我们要么将数字与前三行中的数字进行比较,要么对最后一行进行类似的string比较2排。

然而列D让我,基本上是我的问题。

如果1234 = "000001234"1234 = cl.Value那么为什么不是"000001234" = cl.Value在所有情况下?

cl.Valuetypes是vbDouble (前3个样本行)或vbString (其他两个),请参阅VarType()函数 。 但在比较中,有types转换。
因此

  • 将数值与数字1234进行比较将始终成功,因为cl中的双精度和string。在比较之前, cl.Value被转换为数字(整数)。 前导零在转换为数字时变得微不足道。
  • 比较string"000001234"值只会在string000001234情况下成功,因为在比较之前, cl.Value被转换为string,因此对于第一个样本行"000001234" <> "1234" (请参阅cl.Value0000012341234"1234" )。 其他行类似: 1234.001234"1234" ,这又不等于"000001234"