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

怪胎怪胎

我明白:

  • Range.Item 返回一个 Range 对象,该对象表示与指定范围偏移的范围

  • Range.Cells 返回一个 Range 对象,该对象表示指定范围内的单元格

然而,当我读到"Item is a default property of the Rangeobject"时,混乱就开始了

这让我想问:

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

为什么不只是Range("A1:D5").Item(1,1)在任何情况下使用

为什么 VBA 程序员似乎使用Cells属性来引用范围而不是Item属性?仅省略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使其成为该类的默认成员。

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

例如,当您想访问ia索引的项目时Collection,您可以这样做:

foo = myCollection.Item(i)

但由于Item是在默认属性中的Collection类,你也可以这样做:

foo = myCollection(i)

结果是完全一样的。

Range班是......一个特殊的动物。如果您在Object Browser 中查看它的定义,您会发现它的默认属性是一个名为 的隐藏属性_Default,它通常被推断为返回Range.Value- 因为这个隐式默认成员调用:

foo = Sheet1.Range("A1")

相当于这个显式代码:

foo = Sheet1.Range("A1").Value

Item属性不是默认成员。但是,如果您查看该隐藏属性的定义,您会发现它接受两个可选参数:Range_Default

属性 _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属性未参数化:

属性单元格作为范围

因此,Range.Cells使用参数调用的 VBA 程序员实际上是Range._Default使用这些参数调用,针对Cells...返回的范围,这意味着Range("A1:A10").Cells(1)有效Range("A1:A10").Cells.Item(1)... 这涉及对Cells.

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

最佳实践是编写代码来执行它所说的,并说明它所做的- 因此您通常希望避免隐式默认成员调用。然而,在这种情况下,Range这与另一个最佳实践相冲突,即尽可能编写编译时验证的早期绑定代码- 使用Cells而不是Item给你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解flex和flex-grow属性之间的区别

来自分类Dev

试图了解/ dev / stdin和php:// stdin之间的区别

来自分类Dev

试图了解进程特权属性

来自分类Dev

子对象和作为属性的对象之间的区别?

来自分类Dev

试图了解nodeJS和javascript对象

来自分类Dev

试图了解nodeJS和javascript对象

来自分类Dev

node.js中对象的方法和属性之间的区别

来自分类Dev

方法定义和对象的函数属性之间的区别

来自分类Dev

使用IEnumerator和使用数组作为属性之间的区别

来自分类Dev

颜色属性和使用gl_Color之间的区别

来自分类Dev

属性和使用ALTER创建的列之间的区别?

来自分类Dev

QML:组件,元素,属性,属性和对象之间有什么区别?

来自分类Dev

QML:组件,元素,属性,属性和对象之间有什么区别?

来自分类Dev

试图了解此C程序中静态作用域和动态作用域之间的区别

来自分类Dev

试图了解Freebase中的“预期类型”和“ type.property.schema”属性

来自分类Dev

试图了解类型属性,例如static和swift的class关键字

来自分类Dev

试图了解Freebase中的“预期类型”和“ type.property.schema”属性

来自分类Dev

试图了解使用docker(Scheduler,Queue,Workers)与Docker(Airflow)之间的区别

来自分类Dev

试图了解我何时应使用id和/或class标记

来自分类Dev

试图在laravel关系belongsTo和hasMany上获取none对象的属性

来自分类Dev

Pygame Rect对象的.width和.w属性之间有什么区别?

来自分类Dev

box-shadow属性上的none和initial关键字之间的区别?

来自分类Dev

VBA#1004使用Range(Cells(,),Cells(,))

来自分类Dev

HttpClient.Timeout和使用WebRequestHandler超时属性之间有什么区别?

来自分类Dev

HTML事件属性和使用HTML DOM分配事件之间有什么区别?

来自分类Dev

使用 getter 和 setter 方法将列表添加到 bean 属性之间的区别?

来自分类Dev

试图了解使用对象和类的简单python游戏的流程和逻辑

来自分类Dev

试图了解sudoers文件中“ modernNeo ALL =(ALL:ALL)ALL”和“ modernNeo ALL =(ALL)ALL”之间的区别

来自分类Dev

在Excel-VBA上对Cells,Range,Rows.count和xlup使用Split函数

Related 相关文章

  1. 1

    了解flex和flex-grow属性之间的区别

  2. 2

    试图了解/ dev / stdin和php:// stdin之间的区别

  3. 3

    试图了解进程特权属性

  4. 4

    子对象和作为属性的对象之间的区别?

  5. 5

    试图了解nodeJS和javascript对象

  6. 6

    试图了解nodeJS和javascript对象

  7. 7

    node.js中对象的方法和属性之间的区别

  8. 8

    方法定义和对象的函数属性之间的区别

  9. 9

    使用IEnumerator和使用数组作为属性之间的区别

  10. 10

    颜色属性和使用gl_Color之间的区别

  11. 11

    属性和使用ALTER创建的列之间的区别?

  12. 12

    QML:组件,元素,属性,属性和对象之间有什么区别?

  13. 13

    QML:组件,元素,属性,属性和对象之间有什么区别?

  14. 14

    试图了解此C程序中静态作用域和动态作用域之间的区别

  15. 15

    试图了解Freebase中的“预期类型”和“ type.property.schema”属性

  16. 16

    试图了解类型属性,例如static和swift的class关键字

  17. 17

    试图了解Freebase中的“预期类型”和“ type.property.schema”属性

  18. 18

    试图了解使用docker(Scheduler,Queue,Workers)与Docker(Airflow)之间的区别

  19. 19

    试图了解我何时应使用id和/或class标记

  20. 20

    试图在laravel关系belongsTo和hasMany上获取none对象的属性

  21. 21

    Pygame Rect对象的.width和.w属性之间有什么区别?

  22. 22

    box-shadow属性上的none和initial关键字之间的区别?

  23. 23

    VBA#1004使用Range(Cells(,),Cells(,))

  24. 24

    HttpClient.Timeout和使用WebRequestHandler超时属性之间有什么区别?

  25. 25

    HTML事件属性和使用HTML DOM分配事件之间有什么区别?

  26. 26

    使用 getter 和 setter 方法将列表添加到 bean 属性之间的区别?

  27. 27

    试图了解使用对象和类的简单python游戏的流程和逻辑

  28. 28

    试图了解sudoers文件中“ modernNeo ALL =(ALL:ALL)ALL”和“ modernNeo ALL =(ALL)ALL”之间的区别

  29. 29

    在Excel-VBA上对Cells,Range,Rows.count和xlup使用Split函数

热门标签

归档