gpt4 book ai didi

excel - 试图了解在 Range 对象上使用 Item 属性和 Cells 属性之间的区别

转载 作者:行者123 更新时间:2023-12-04 21:20:35 25 4
gpt4 key购买 nike

我明白:

  • Range.Item返回一个 Range 对象,该对象表示在指定范围的偏移处的范围。
  • Range.Cells返回一个 Range 对象,该对象表示指定范围内的单元格。

  • 然而,当我读到“Item 是 Range 对象的默认属性”时,困惑就出现了。

    这让我问:

    Range("A1:D5").Cells(1,1)真的是简化版 Range("A1:D5").Cells.Item(1,1) ?

    为什么不直接使用 Range("A1:D5").Item(1,1)任何状况之下?

    为什么 VBA 程序员似乎使用 Cells属性到引用范围而不是 Item属性(property)?省略 Item 是“最佳实践”吗?支持 Cells 的默认属性?

    最佳答案

    Range是一类。类是对象的蓝图——对象是类的一个实例。

    现在,VBA 中的类可以有一个默认属性。如果你导出一个类模块,你可以给他们成员属性。 VB_UserMemId属性,值为 0 , 将成员标识为该类的默认成员 - 您无法直接在 VBE 中编辑成员属性,但您可以导出模块、添加属性并将模块重新导入项目。

    默认属性可能如下所示:

    Option Explicit
    Private mFoo As Bar

    Public Property Get Foo() As Bar
    Attribute Foo.VB_UserMemId = 0
    Set Foo = mFoo
    End Property

    有许多可能的 VB_UserMemId您可以使用的值,但只有一个类的成员可以具有任何给定值 - 0使其成为该类的默认成员。

    默认成员允许您编写隐式代码 - 这是否是一件好事是一个判断调用。

    例如,当您要访问索引 i 处的项目时的 Collection , 你可以这样做:
    foo = myCollection.Item(i)

    但是自从 ItemCollection 的默认属性类,你也可以这样做:
    foo = myCollection(i)

    结果是完全一样的。
    Range类(Class)是……一种特殊的动物。如果您在对象浏览器中查看它的定义,您会发现它的默认属性是一个名为 _Default 的隐藏属性。 , 通常推断返回 Range.Value - 因为这个隐式默认成员调用:
    foo = Sheet1.Range("A1")

    相当于这个显式代码:
    foo = Sheet1.Range("A1").Value
    Item Range 的属性(property)类不是默认成员。但是,如果您查看隐藏的定义 _Default属性,您会看到它接受两个可选参数:

    Property _Default({RowIndex},{ColumnIndex})

    所以这也是合法的:
    foo = Sheet1.Range("A1:A10")(1)

    相当于这个:
    foo = Sheet1.Range("A1:A10").Item(1).Value

    基本上, Range类的默认属性的实现方式是,如果没有指定参数,它会做一件事(为您提供 Value .. 它本身返回单元格的值,如果范围包含多个单元格,则返回二维变量数组),如果指定了参数,则另一件事(在该范围内的指定行/列中为您提供 Item)。

    所以这就是为什么 Range("A1:A10").Cells (没有参数)是多余的:它产生与 Range("A1:A10") 完全相同的单元格做。
    Cells属性未参数化:

    Property Cells As Range

    所以 VBA 程序员调用 Range.Cells带参数,实际上是在调用 Range._Default使用这些参数,根据 Cells 返回的范围... 这意味着 Range("A1:A10").Cells(1)实际上是 Range("A1:A10").Cells.Item(1) ...这涉及对 Cells 的冗余调用.

    参数化 Cells[._Default][.Item](1)因此语法只是为了方便;它主要是可读性...然后是 IntelliSense: Item返回 Variant ,这意味着当您键入 . 时,您不会得到可用成员的漂亮小下拉列表。在它之后的点/取消引用运算符(调用是“后期绑定(bind)”,即所涉及的类型在运行时解析) - 但是当你调用 Cells 时你会这样做, 因为 Cells返回早期绑定(bind) Range对象(即在编译时解析)。

    最佳实践是编写代码做它所说的,并说明它所做的——因此您通常希望避免隐式默认成员调用。但是对于 Range这与另一个最佳实践相冲突,即尽可能编写经过编译时验证的早期绑定(bind)代码 - 使用 Cells而不是 Item给你。

    关于excel - 试图了解在 Range 对象上使用 Item 属性和 Cells 属性之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51970397/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com