宏记录仪产生了以下声明:
Cells.Select现在我了解到,如果没有对象限定符,这将返回所有单元格作为Range对象。
然而,我想知道这一声明的完全限定的版本是什么?
是:
Application.Cells.SelectApplication.ActiveSheet.CellsApplication.ActiveWorkbook.ActiveSheet.Cells换句话说,在运行Cells.Select时,哪些完全限定语句实际上由VBE执行?
所有这些有什么区别?由于所有这些访问最终都是同一个对象--如果我想显式限定所有对象,那么我会使用哪条语句,这仅仅是个人偏好吗?
非常感谢!
发布于 2018-08-17 14:54:14
(这很复杂:)
因为所有这些最终都访问同一个对象
是真的。关键词“最后”。区别在于要走多少步才能到达那里.
不合格的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是合理的,Application公开了Global的所有成员,然后还有一些成员。
正如您所提到的,Application也有一个Cells属性--但是Cells属于Worksheet,所以不管我们做什么,我们都需要一个Worksheet限定符.然后,任何工作表都属于Worksheets集合,该集合属于Workbook对象,因此我们可以推断,不合格的Cells调用将以完全显式的表示法表示,相当于.(鼓声):
Application.ActiveWorkbook.ActiveSheet.Cells但是,您不需要那么显式,因为ActiveSheet有一个始终是ActiveWorkbook的Parent,所以这也是显式的,而不是过激的:
ActiveSheet.Cells但这都是假设的全球背景。这个答案解释了关于它的一切--它的要点是,如果您在工作表的代码背后,那么不合格的Cells成员调用不是Global.Cells,而是Me.Cells。
现在,注意Cells返回一个Range。因此,每当您在不提供参数的情况下对Range调用它时,就需要进行冗余的成员调用:
ActiveSheet.Range("A1:B10").Cells ' parameterless Range.Cells is redundant发布于 2018-08-17 14:35:34
让我们把这个职位拆开:
Cells.Select 现在我了解到,如果没有对象限定符,这将返回所有单元格作为范围对象。
这实际上有点不正确。虽然.Cells确实返回返回所有单元格的Range.Cells对象,但Cells.Select实际上是Range对象的一个方法,正如您可能已经猜到的--Select的范围(在我们的例子中,是所有的单元格)。
Select方法,与MSDN 一样,实际上返回一个,而不是Range对象。这是一个非常重要的区别,特别是如果你计划把这个值传递给任何东西。所以如果我们假装是个编译器
Cells -> ActiveWorkbook.ActiveSheet.Range.Cells返回所有单元格的RangeRange.Cells.Select ->我们先取返回的Range,然后在工作表中选择单元格,然后实际返回Variant (而不是Range)。至于问题的另一部分。这取决于模块的放置位置。默认情况下,Cells是以下语句的缩写:
Application.ActiveWorkbook.ActiveSheet.Range.Cells但是,这可能会根据模块放置的位置以及应用程序、工作簿或工作表是否已被修改而更改。
一般来说,每当您引用一个Worksheet对象时,总是指定至少一个特定的Range对象是一种很好的编码实践,例如。
Sheets("Sheet1").Range.Cells 这是显式的,因此对于您或任何使用您的代码的人来说,这都不太容易理解和理解得更清楚。你总是知道你到底在做什么,而不是任由你去猜测。
显然,当您开始使用多个工作簿时,在Workbook之前集成Sheet对象语句是个好主意。你明白我的意思了。
最后但并非最不重要的一点是,无论您想要做什么,都可能是为了最好地避免使用Select。这通常是不值得的,而且容易出现意想不到的行为。
检查这里的问题:如何避免在Excel中使用Select
发布于 2018-08-17 16:15:55
如果您只键入Cells - in本身,它就什么也不做了。它和Range.Cells是一样的。Cells的唯一优点是它可以接受列的数值(第二个参数)。当你做复杂的操作时,它非常方便。
Range.Cells只返回Range对象。当您有Range对象时,请将它看作是一个小的Excel工作表。比如说,你有距离Range("F3:J10")。然后,以下范围都引用H3单元格:
Range("F3:J10").Cells(3)Range("F3:J10")(3)Range("F3:J10").Cells(1, 3)Range("F3:J10")(1, 3)Range("F3:J10").Cells(1, "C")Range("F3:J10")(1, "C")Range("F3:J10").Range("C1")https://stackoverflow.com/questions/51897030
复制相似问题