奇怪的方式比较发生
这是奇怪的,我曾经在这里看到这个问题: 与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.Value
types是vbDouble (前3个样本行)或vbString (其他两个),请参阅VarType()函数 。 但在比较中,有types转换。
因此
- 将数值与数字
1234
进行比较将始终成功,因为cl中的双精度和string。在比较之前,cl.Value
被转换为数字(整数)。 前导零在转换为数字时变得微不足道。 - 比较string
"000001234"
值只会在string000001234
情况下成功,因为在比较之前,cl.Value
被转换为string,因此对于第一个样本行"000001234" <> "1234"
(请参阅cl.Value
:000001234
→1234
→"1234"
)。 其他行类似:1234.00
→1234
→"1234"
,这又不等于"000001234"
等