Vba 比较的方式很奇怪
这是我在这里看到这个问题时遇到的一件奇怪的事情:我想我可能会对此展开讨论,看看是否有人可以解释 假设我有一个Excel文档,列Vba 比较的方式很奇怪,vba,excel,Vba,Excel,这是我在这里看到这个问题时遇到的一件奇怪的事情:我想我可能会对此展开讨论,看看是否有人可以解释 假设我有一个Excel文档,列A中有5个单元格,所有单元格的值均为1234 第一个使用格式字符串“000000000” 第二种格式使用Excel的“数字”格式 第三种格式为Excel的“通用”格式 第四种格式为“文本” 第五个格式为“Text”,但实际上是字符串“000001234” 因此,excel表如下所示 A | ----------+- 000001234| 123
A
中有5个单元格,所有单元格的值均为1234
- 第一个使用格式字符串
“000000000”
- 第二种格式使用Excel的“数字”格式
- 第三种格式为Excel的“通用”格式
- 第四种格式为“文本”
- 第五个格式为“Text”,但实际上是字符串
“000001234”
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
也有意义,在每种情况下,我们要么像前3行那样比较数字,要么在后2行中进行类似的字符串比较
然而,D
栏吸引了我,基本上是我的问题
如果
1234=“000001234”
和1234=cl.Value
,那么为什么在所有情况下“000001234”=cl.Value
的类型都是vbDouble(前3个样本行)或vbString(其他两个),请参阅。但在比较过程中,存在类型转换。所以
- 将值与数字
进行比较总是成功的,因为在比较之前,1234
中的双精度和字符串会转换为数字(整数)。前导零在转换为数字时变得不重要cl.Value
- 只有在字符串
的情况下,将值与字符串000001234
进行比较才会成功,因为“000001234”
在比较之前会转换为字符串,所以对于第一个示例行cl.Value
(请参见“000001234”“1234”
的情况:cl.Value
→ <代码>1234→ <代码>“1234”)。对于其他行,它是类似的:000001234
→ <代码>1234→ <代码>“1234”这也不等于1234.00
等“000001234”