Application.Cells VS Application.ActiveSheet.Cells

Gee*_*aky 3 excel vba excel-vba cells vbe

宏记录器生成以下语句:

Cells.Select
Run Code Online (Sandbox Code Playgroud)

现在我明白,如果没有对象限定符,这将返回所有单元格作为Range对象.

但是,我想知道这个陈述的完全限定版本是什么?

是吗:

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

换句话说,VBE在运行时实际执行了哪一个完全限定的语句Cells.Select

所有这些之间的区别是什么?因为所有这些最终都访问了同一个对象 - 如果我想明确限定所有对象,那么我会使用哪个语句来个人偏好?

非常感谢!

Mat*_*don 5

情况很复杂 :)

因为所有这些最终都访问相同的对象

真正.关键词"到底".区别在于到达那里需要多少步骤 ......

不合格Cells(或Range,Rows,Columns,Names,等)不是魔法,他们是成员的呼叫(Property Get)反对巧妙地命名为隐藏,全球范围对象Global:

对象浏览器:'Global'的成员

您可以通过在标准模块中炸毁来验证是否涉及此隐藏对象:

Sub GoesBoom()
    'throws error 1004 "Method 'Range' of object '_Global' failed"
    Debug.Print Range(Sheet2.Cells(1, 1), Sheet3.Cells(1, 1))
End Sub
Run Code Online (Sandbox Code Playgroud)

_Global并且Global密切相关 - 如果没有深入到COM中,你可以考虑Global类和_Global它的接口(虽然它不是那么相似 - 查看"COM coClasses"以获取更多信息).

但是Cells这个Range类的属性:

对象浏览器:'Range'的成员

认为假定Global调用几乎都被重定向到Application,这暴露了所有成员Global,然后是一些成员,这是合理的.

现在正如你所说,Application也有一个Cells属性 - 但Cells属于一个Worksheet,所以不管我们做什么,我们需要最终得到一个Worksheet限定符......然后任何工作表属于一个Worksheets集合,属于一个Workbook对象 - 所以我们可以推断出一个不合格的Cells呼叫,在完全显式的表示法中,相当于......(鼓声):

Application.ActiveWorkbook.ActiveSheet.Cells
Run Code Online (Sandbox Code Playgroud)

但是你不需要那么明确,因为ActiveSheet有一个Parent总是那样的ActiveWorkbook,所以这也是明确的,而不会过分:

ActiveSheet.Cells
Run Code Online (Sandbox Code Playgroud)

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


现在,注意Cells返回一个Range.因此,无论何时在Range不提供参数的情况下调用它,您都会进行冗余成员调用:

ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant
Run Code Online (Sandbox Code Playgroud)