vba - Application.Cells VS Application.ActiveSheet.Cells
问题描述
宏记录器生成以下语句:
Cells.Select
现在我明白了,如果没有对象限定符,这会将所有单元格作为Range
对象返回。
但是,我想知道该语句的完全限定版本是什么?
是吗:
Application.Cells.Select
Application.ActiveSheet.Cells
Application.ActiveWorkbook.ActiveSheet.Cells
换句话说,这些完全限定语句中的哪一条在 VBE 运行时实际上是由它执行的Cells.Select
?
所有这些有什么区别???由于所有这些最终都访问同一个对象 - 如果我想明确限定所有对象,我会使用哪个语句只是个人偏好吗?
太感谢了!
解决方案
情况很复杂 :)
由于所有这些最终都访问同一个对象
真的。关键词“到底”。不同之处在于到达那里需要多少步骤......
不合格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”以获取更多信息)。
但是Cells
是Range
类的一个属性:
我认为假设Global
调用几乎都重定向到 是合理的Application
,这会暴露 的所有成员Global
,然后是一些成员。
现在正如您所指出的,Application
还有一个Cells
属性 - 但Cells
属于 a Worksheet
,所以无论我们做什么,我们都需要以一个Worksheet
限定符结束......然后任何工作表都属于一个Worksheets
集合,该集合属于一个Workbook
对象 - 所以我们可以推断出一个不合格的Cells
调用,在完全明确的符号中,相当于......(drumroll):
Application.ActiveWorkbook.ActiveSheet.Cells
但是你不需要那么明确,因为ActiveSheet
aParent
总是会是ActiveWorkbook
,所以这也是明确的,不会过火:
ActiveSheet.Cells
但这都是假设全球背景。这个答案解释了它的一切——它的要点是,如果你在工作表的代码隐藏中,那么不合格的Cells
成员调用不是Global.Cells
, but Me.Cells
。
现在,请注意Cells
返回一个Range
. 因此,每当您在Range
不提供参数的情况下针对 a 调用它时,都会进行冗余成员调用:
ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant
推荐阅读
- c# - 所有用户和会话都使用相同的 asp.net sessionID
- sql - 如何构建丢弃重复数据的 SQL 查询?
- python - 如何将字符串年-日-年-毫秒转换为日期时间对象
- javascript - 如何优化列表所有猫鼬查询?
- javascript - 在 Node.js 和浏览器中排序数组结果不同
- django - django 模型保存方法的奇怪行为。“(1048,“列'created_at'不能为空”)“在具有auto_now_add = True的字段上
- symfony - OVH 服务器上的 symfony 4.3,缓存清除返回错误 255(同时 composer update / heroku deploy from github)
- azure - 使用 Get-AzTable Powershell 脚本从 Azure 表访问数据时出错
- c - 编写一个在 C 中创建锯齿状 2D 零数组的函数
- android - Android 深层链接总是先在浏览器中打开,然后才是正确的活动