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

时间:2015-10-07 15:47:28

标签: vba

在开始之前我想说我意识到你永远不应该依赖默认属性而我不会,但这很奇怪。我一直认为valueRange对象的默认属性,因此可行的原因是:

Range("A1") = 2

但是,this页面声称itemRange的默认属性。

此外,我提出的这个子建议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

2 个答案:

答案 0 :(得分:7)

Range类的默认成员名为_Default并被隐藏。当您启用"显示隐藏成员"对象浏览器中的功能,您可以看到它:

VBA Object Browser

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

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

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

(*)作为评论中的@GSerg points out_Default()_Item()并不完全相同。

答案 1 :(得分:0)

是的,看起来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

请注意,Range(" A1")的结果与Range(" A1")相同。值和范围(" A1") .Value2