Vba Application.Cells与Application.ActiveSheet.Cells
宏记录器生成以下语句:Vba Application.Cells与Application.ActiveSheet.Cells,vba,excel,cells,vbe,Vba,Excel,Cells,Vbe,宏记录器生成以下语句: Cells.Select Application.ActiveWorkbook.ActiveSheet.Range.Cells 现在我了解到,如果没有对象限定符,这将返回所有单元格作为Range对象 然而,我想知道这个声明的完全限定版本是什么 是: Application.Cells.选择 Application.ActiveSheet.Cells Application.ActiveWorkbook.ActiveSheet.Cells 换句话说,当VBE运行单元格时
Cells.Select
Application.ActiveWorkbook.ActiveSheet.Range.Cells
现在我了解到,如果没有对象限定符,这将返回所有单元格作为Range
对象
然而,我想知道这个声明的完全限定版本是什么
是:
Application.Cells.选择
Application.ActiveSheet.Cells
Application.ActiveWorkbook.ActiveSheet.Cells
单元格时,哪个完全限定语句是由VBE实际执行的。选择
所有这些之间的区别是什么???因为所有这些最终都访问同一个对象——如果我想显式地限定所有对象,我会使用哪种语句,这只是个人偏好吗
非常感谢你 让我们把这篇文章拆开:
现在我明白了,如果没有对象限定符,这将返回
将所有单元格作为范围对象
这实际上有点不正确。虽然.Cells
返回一个范围。Cells
对象返回所有单元格,Cells.Select
实际上是范围
对象的一个方法,正如您可能猜到的那样,选择范围(在我们的例子中,所有单元格)
根据的Select
方法实际上返回一个变量
,而不是范围
对象。
这是一个非常重要的区别,特别是如果你打算把这个值传递给任何东西。所以如果我们假装是一个编译器
单元格
->ActiveWorkbook.ActiveSheet.Range.Cells
返回所有单元格的Range
Range.Cells.选择
->首先我们获取返回的范围
,然后在工作表中选择单元格,并实际返回一个变量
(不是范围
)
至于问题的另一部分。这取决于模块放置的位置。默认情况下,单元格
是以下语句的缩写:
Cells.Select
Application.ActiveWorkbook.ActiveSheet.Range.Cells
但是,这可能会根据模块放置的位置以及应用程序、工作簿或工作表是否已修改而有所更改
一般来说,每当您引用范围时,总是至少指定一个特定的工作表
对象是一种良好的编码实践,例如
Sheets("Sheet1").Range.Cells
这是显式的,因此不太容易出错,更容易理解,无论是您还是任何使用代码的人。。你总是知道自己在做什么,而不是靠猜测
显然,当您开始使用多个工作簿时,最好将工作簿
对象语句合并到工作表
之前。你明白我的意思了
最后但并非最不重要的一点是,无论您想做什么,最好避免使用Select
。这通常是不值得的,而且容易出现意想不到的行为
在这里检查这个问题:它很复杂:)
因为所有这些最终都访问同一个对象
对。关键词“最后”。区别在于要走多少步才能到达那里
不合格的单元格
(或范围
,行
,列
,名称
,等等)不是魔法,它们是针对一个隐藏的全局范围对象的成员调用(属性Get
):
通过在标准模块中放大,可以验证是否涉及此隐藏对象:
Sub GoesBoom()
'throws error 1004 "Method 'Range' of object '_Global' failed"
Debug.Print Range(Sheet2.Cells(1, 1), Sheet3.Cells(1, 1))
End Sub
<代码>全局< /COD>和 Global 是紧密相关的——不深入到COM中,可以考虑<代码> Global 类,和IGlobal 其接口(这不是真的那样)-查看“com类”以获得更多信息。
但是单元格
是范围
类的属性:
我认为有理由假定Global
调用几乎都重定向到应用程序,它公开了Global
的所有成员,然后是一些成员
现在正如您所注意到的,应用程序
也有一个单元格
属性-但是单元格
属于工作表
,所以无论我们做什么,我们都需要一个工作表
限定符。。。然后,任何工作表都属于工作表
集合,它属于工作簿
对象-因此,我们可以推断,以完全显式表示法,非限定的单元格
调用相当于。。。(drumroll):
但是您不需要那么明确,因为ActiveSheet
有一个Parent
,它将始终是ActiveWorkbook
,因此这也是明确的,不会过火:
ActiveSheet.Cells
但这都是假设全球环境。解释了关于它的所有内容-其要点是,如果您在工作表的代码隐藏中,则非限定的单元格
成员调用不是全局.Cells
,而是Me.Cells
现在,请注意,单元格
返回一个范围
。因此,每当您针对范围
调用它而不提供参数时,您就是在进行冗余成员调用:
ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant
如果只在单元格中键入,
,它本身不起任何作用。它与Range.Cells
相同。单元格的唯一优点是它可以接受列的数值(第二个参数)。当你做复杂的操作时,它非常方便
Range.Cells
只返回Range
对象。当您拥有范围
对象时,请将其视为一个小的Excel工作表。比如说,您有范围范围(“F3:J10”)
。然后,以下范围均指H3
单元:
范围(“F3:J10”)。单元(3)
范围(“F3:J10”)(3)
<