我觉得这很奇怪,我在这里看到这个问题:Issue with VBA Excel number formatting我想我可能会扩展它并看看是否有人可以解释。
假设我有一个包含A
列中5个单元格的Excel文档,其值均为1234
"000000000"
"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可以比较字符串就好像它们是数字一样,并且通过扩展,列C
也是有意义的,在每种情况下,我们要么将数字与数字进行比较,要么像前三行一样,或者做一个类似的字符串最后两行比较。
然而,专栏D
得到了我,基本上是我的问题。
如果1234 = "000001234"
和1234 = cl.Value
那么为什么在所有情况下都不会"000001234" = cl.Value
?
答案 0 :(得分:1)
cl.Value
的类型为 vbDouble (前3个示例行)或 vbString (其他两个),请参阅VarType() function。但在比较过程中,有型铸造
因此
1234
进行比较将始终成功,因为在比较之前,cl.Value
中的双精度数字和字符串将转换为数字(整数)。在转换为数字时,前导零变得微不足道。"000001234"
进行比较只会在字符串000001234
的情况下成功,因为cl.Value
在比较之前会转换为字符串,因此您的第一个示例行"000001234" <> "1234"
(请参阅恰好cl.Value
:000001234
→1234
→"1234"
)。对于其他行,它类似:1234.00
→1234
→"1234"
,这又不等于"000001234"
等。