情况很复杂 :)
由于所有这些最终都访问同一个对象
真的。关键词“到底”。区别在于需要多少步才能到达那里...
不合格Cells
(or 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
and Global
密切相关 - 无需深入研究 COM,您可以考虑Global
班级,以及_Global
它的接口(虽然它并不完全像那样 - 查看“COM coClasses”以获取更多信息)。
But Cells
是的财产Range
class:
I think可以合理地假设Global
呼叫几乎全部重定向到Application
,这暴露了所有成员Global
, 然后还有一些。
现在正如你所指出的,Application
还有一个Cells
财产——但是Cells
属于Worksheet
,所以无论我们做什么,我们最终都需要得到一个Worksheet
限定符...然后任何工作表都属于Worksheets
集合,属于Workbook
对象 - 所以我们可以推断出一个不合格的Cells
以完全明确的表示法来说,调用相当于...(鼓声):
Application.ActiveWorkbook.ActiveSheet.Cells
但你不需要that明确的,因为ActiveSheet
has a Parent
那永远是ActiveWorkbook
,所以这也是明确的,但又不会太过分:
ActiveSheet.Cells
但这都是在全球背景下进行的。这个答案解释了有关它的一切 - 它的要点是,如果您位于工作表的代码隐藏中,那么一个不合格的Cells
会员电话不是Global.Cells
, but Me.Cells
.
现在,请注意Cells
返回一个Range
。因此,每当您针对某个对象调用它时Range
如果不提供参数,您将进行多余的成员调用:
ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant