"Value"实际上是Range对象的默认属性吗?

apd*_*pdm 7 vba

在我开始之前,我想说我意识到你不应该依赖默认属性而我不会,但这很奇怪.我一直都读到这valueRangeObject 的默认属性,因此为什么会这样:

Range("A1") = 2
Run Code Online (Sandbox Code Playgroud)

但是,页面声称这item是默认属性Range.

此外,我做的这个子将建议这cells是默认属性:

Sub defaultprop()

Dim c As Variant


For Each c In Range("A1:A2")

    Debug.Print c.value

Next c

For Each c In Range("A1:A2").value

    Debug.Print c

Next c


End Sub
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 7

Range该类的默认成员被调用_Default并被隐藏.在对象浏览器中启用"显示隐藏成员"功能后,您可以看到它:

VBA对象浏览器

它具有与.Item属性完全相同的签名,因此其中一个可以说是另一个的别名.(*)

无论如何,Range还实现了集合接口.因此,它可以在For Each循环中使用 - 当你这样做时,循环将调用.Item每次迭代并将当前项分配给循环变量.

当在枚举之外使用时,例如with Debug.Print,.Value则会被使用,但我无法解释原因.也许其他人可以提出一个提示.(*)


(*)作为@GSerg 指出,在评论,_Default()_Item()不是完全相等.

  • `_Default`的签名与`.Item`属性的签名不完全相同 - 第一个参数在`_Default`中是可选的,在`Item`中是必需的.从COM的角度来看,我能提出的唯一解释是`_Default`是唯一真正的默认属性,它根据是否提供参数调用`Item`或`Value`.请注意,如果提供了参数,`_Default`将不会调用`Value`,即使`Value`也接受参数. (4认同)
  • 这与后期绑定有关(后期绑定和默认属性可能会发生奇怪的事情,某处有一个链接,但我找不到它)。如果您声明“Worksheet”变量,则“w.UsedRange(1)”可以正常工作。 (2认同)
  • 嗯,从技术上讲,它“是”一个函数。VB 将参数解释为 getter 的参数,就像“.Item(1)”一样。当 thr getter 接受参数并且返回对象的默认成员执行相同操作时,会出现歧义。恕我直言,属性只不过是语法糖,用于减少对象的函数数量,将 getter 和 setter 合二为一。 (2认同)

zed*_*xus -1

是的,看起来 Value 是 Range 的默认属性。

我在单元格 A1 中放入了一个非常大的数字。

Sub Test()
    Debug.Print "Range default = " & Range("A1") & vbCrLf _
        & "Range Text = " & Range("A1").Text & vbCrLf _
        & "Range Value = " & Range("A1").Value & vbCrLf _
        & "Range Value2 = " & Range("A1").Value2
End Sub

Results in 

Range default = 3.24643541346456E+28
Range Text = 3.25E+28
Range Value = 3.24643541346456E+28
Range Value2 = 3.24643541346456E+28
Run Code Online (Sandbox Code Playgroud)

请注意,Range("A1") 的结果与 Range("A1").Value 和 Range("A1").Value2 相同