奇怪的比较方式发生

时间:2015-02-16 23:39:48

标签: excel vba excel-vba

我觉得这很奇怪,我在这里看到这个问题:Issue with VBA Excel number formatting我想我可能会扩展它并看看是否有人可以解释。

假设我有一个包含A列中5个单元格的Excel文档,其值均为1234

  • 第一个格式为字符串"000000000"
  • 第二种格式使用Excel的“数字”格式
  • 第三种格式为Excel的“常规”格式
  • 第四个格式为“文字”
  • 第五个格式为“文本”,但实际上是字符串"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

1 个答案:

答案 0 :(得分:1)

cl.Value的类型为 vbDouble (前3个示例行)或 vbString (其他两个),请参阅VarType() function。但在比较过程中,有型铸造 因此

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