首页 > 解决方案 > Application.Cells VS Application.ActiveSheet.Cells

问题描述

宏记录器生成以下语句:

Cells.Select

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

但是,我想知道该语句的完全限定版本是什么?

是吗:

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

换句话说,这些完全限定语句中的哪一条在 VBE 运行时实际上是由它执行的Cells.Select

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

太感谢了!

标签: vbaexcelcellsvbe

解决方案


情况很复杂 :)

由于所有这些最终都访问同一个对象

真的。关键词“到底”。不同之处在于到达那里需要多少步骤......

不合格Cells(或Range, Rows, Columns,Names等)并不神奇,它们是Property Get针对隐藏的全局范围对象的成员调用 ( ),该对象巧妙地命名为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

_Global并且Global密切相关 - 无需深入研究 COM,您可以考虑Global该类_Global及其接口(虽然它并不完全如此 - 查看“COM coClasses”以获取更多信息)。

但是CellsRange类的一个属性:

对象浏览器:“范围”的成员

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

现在正如您所指出的,Application还有一个Cells属性 - 但Cells属于 a Worksheet,所以无论我们做什么,我们都需要以一个Worksheet限定符结束......然后任何工作表都属于一个Worksheets集合,该集合属于一个Workbook对象 - 所以我们可以推断出一个不合格的Cells调用,在完全明确的符号中,相当于......(drumroll):

Application.ActiveWorkbook.ActiveSheet.Cells

但是你不需要那么明确,因为ActiveSheetaParent总是会是ActiveWorkbook,所以这也是明确的,不会过火:

ActiveSheet.Cells

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


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

ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant

推荐阅读