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运行
    单元格时,哪个完全限定语句是由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)
  • <