Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 比较的方式很奇怪_Vba_Excel - Fatal编程技术网

Vba 比较的方式很奇怪

Vba 比较的方式很奇怪,vba,excel,Vba,Excel,这是我在这里看到这个问题时遇到的一件奇怪的事情:我想我可能会对此展开讨论,看看是否有人可以解释 假设我有一个Excel文档,列A中有5个单元格,所有单元格的值均为1234 第一个使用格式字符串“000000000” 第二种格式使用Excel的“数字”格式 第三种格式为Excel的“通用”格式 第四种格式为“文本” 第五个格式为“Text”,但实际上是字符串“000001234” 因此,excel表如下所示 A | ----------+- 000001234| 123

这是我在这里看到这个问题时遇到的一件奇怪的事情:我想我可能会对此展开讨论,看看是否有人可以解释

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

  • 第一个使用格式字符串
    “000000000”
  • 第二种格式使用Excel的“数字”格式
  • 第三种格式为Excel的“通用”格式
  • 第四种格式为“文本”
  • 第五个格式为“Text”,但实际上是字符串
    “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
也有意义,在每种情况下,我们要么像前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
    的情况:
    000001234
    → <代码>1234→ <代码>“1234”)。对于其他行,它是类似的:
    1234.00
    → <代码>1234→ <代码>“1234”这也不等于
    “000001234”