首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Application.Cells对Application.ActiveSheet.Cells

Application.Cells对Application.ActiveSheet.Cells
EN

Stack Overflow用户
提问于 2018-08-17 13:59:37
回答 3查看 1.4K关注 0票数 3

宏记录仪产生了以下声明:

代码语言:javascript
复制
Cells.Select

现在我了解到,如果没有对象限定符,这将返回所有单元格作为Range对象。

然而,我想知道这一声明的完全限定的版本是什么?

是:

  1. Application.Cells.Select
  2. Application.ActiveSheet.Cells
  3. Application.ActiveWorkbook.ActiveSheet.Cells

换句话说,在运行Cells.Select时,哪些完全限定语句实际上由VBE执行?

所有这些有什么区别?由于所有这些访问最终都是同一个对象--如果我想显式限定所有对象,那么我会使用哪条语句,这仅仅是个人偏好吗?

非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2018-08-17 14:54:14

(这很复杂:)

因为所有这些最终都访问同一个对象

是真的。关键词“最后”。区别在于要走多少步才能到达那里.

不合格的Cells (或RangeRowsColumnsNames等)它们不是魔法,它们是针对隐藏的全局范围对象的成员调用(Property Get),该对象聪明地命名为Global

您可以通过在一个标准模块中爆炸来验证是否涉及到这个隐藏对象:

代码语言:javascript
复制
Sub GoesBoom()
    'throws error 1004 "Method 'Range' of object '_Global' failed"
    Debug.Print Range(Sheet2.Cells(1, 1), Sheet3.Cells(1, 1))
End Sub

_GlobalGlobal是密切相关的--如果不深入到COM中,您可以考虑使用Global类,而_Global则是它的接口(但并不完全是这样--更多信息请查看"COM coClasses“)。

但是CellsRange类的一个属性:

我认为假定Global调用几乎都重定向到Application是合理的,Application公开了Global的所有成员,然后还有一些成员。

正如您所提到的,Application也有一个Cells属性--但是Cells属于Worksheet,所以不管我们做什么,我们都需要一个Worksheet限定符.然后,任何工作表都属于Worksheets集合,该集合属于Workbook对象,因此我们可以推断,不合格的Cells调用将以完全显式的表示法表示,相当于.(鼓声):

代码语言:javascript
复制
Application.ActiveWorkbook.ActiveSheet.Cells

但是,您不需要那么显式,因为ActiveSheet有一个始终是ActiveWorkbookParent,所以这也是显式的,而不是过激的:

代码语言:javascript
复制
ActiveSheet.Cells

但这都是假设的全球背景。这个答案解释了关于它的一切--它的要点是,如果您在工作表的代码背后,那么不合格的Cells成员调用不是Global.Cells,而是Me.Cells

现在,注意Cells返回一个Range。因此,每当您在不提供参数的情况下对Range调用它时,就需要进行冗余的成员调用:

代码语言:javascript
复制
ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant
票数 5
EN

Stack Overflow用户

发布于 2018-08-17 14:35:34

让我们把这个职位拆开:

Cells.Select 现在我了解到,如果没有对象限定符,这将返回所有单元格作为范围对象。

这实际上有点不正确。虽然.Cells确实返回返回所有单元格的Range.Cells对象,但Cells.Select实际上是Range对象的一个方法,正如您可能已经猜到的--Select的范围(在我们的例子中,是所有的单元格)。

Select方法,与MSDN 一样,实际上返回一个,而不是Range对象。这是一个非常重要的区别,特别是如果你计划把这个值传递给任何东西。所以如果我们假装是个编译器

  1. Cells -> ActiveWorkbook.ActiveSheet.Range.Cells返回所有单元格的Range
  2. Range.Cells.Select ->我们先取返回的Range,然后在工作表中选择单元格,然后实际返回Variant (而不是Range)。

至于问题的另一部分。这取决于模块的放置位置。默认情况下,Cells是以下语句的缩写:

代码语言:javascript
复制
Application.ActiveWorkbook.ActiveSheet.Range.Cells

但是,这可能会根据模块放置的位置以及应用程序、工作簿或工作表是否已被修改而更改。

一般来说,每当您引用一个Worksheet对象时,总是指定至少一个特定的Range对象是一种很好的编码实践,例如。

代码语言:javascript
复制
 Sheets("Sheet1").Range.Cells 

这是显式的,因此对于您或任何使用您的代码的人来说,这都不太容易理解和理解得更清楚。你总是知道你到底在做什么,而不是任由你去猜测。

显然,当您开始使用多个工作簿时,在Workbook之前集成Sheet对象语句是个好主意。你明白我的意思了。

最后但并非最不重要的一点是,无论您想要做什么,都可能是为了最好地避免使用Select。这通常是不值得的,而且容易出现意想不到的行为。

检查这里的问题:如何避免在Excel中使用Select

票数 2
EN

Stack Overflow用户

发布于 2018-08-17 16:15:55

如果您只键入Cells - in本身,它就什么也不做了。它和Range.Cells是一样的。Cells的唯一优点是它可以接受列的数值(第二个参数)。当你做复杂的操作时,它非常方便。

Range.Cells只返回Range对象。当您有Range对象时,请将它看作是一个小的Excel工作表。比如说,你有距离Range("F3:J10")。然后,以下范围都引用H3单元格:

  1. Range("F3:J10").Cells(3)
  2. Range("F3:J10")(3)
  3. Range("F3:J10").Cells(1, 3)
  4. Range("F3:J10")(1, 3)
  5. Range("F3:J10").Cells(1, "C")
  6. Range("F3:J10")(1, "C")
  7. Range("F3:J10").Range("C1")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51897030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档