范围对象 - 为什么我有时不使用工作表

时间:2015-08-09 18:18:42

标签: excel vba excel-vba

在这个帖子中:

Excel VBA find maximum value in range on specific sheet

我从范围对象中发现了一个奇怪的行为。我不能真正把手指放在问题上,这更像是一种感觉。有时,您不应该在范围对象之前加上工作表,有时您可以。对我来说,感觉很明显,但我无法解释它。 任何人都可以澄清一下吗?

这有效:

Range(Cells(1, 1), Cells(2, 2)).Value = "X"

这感觉非常糟糕,但确实有效:

Sheets(2).Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2)).Value = "X"

这些不起作用:

Sheets(1).Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2)).Value = "X"
Sheets(1).Range("Sheet2!A1:B2").Value = "X"

我可以将所有Cell(1,1)对象更改为Range(“a1”),结果将是相同的。

我最好的猜测是,只要传递给Range对象的参数定义了特定工作表上的单元格,就无法在上述范围之前定义工作表。但是,如果不是这种情况,则允许使用工作表对象在Range之前。

3 个答案:

答案 0 :(得分:2)

这似乎有些倒退。您可以始终Sheet之前明确Range,但有时您不需要。 Range Excel对象模型中WorkSheet对象的子项。 VBA有一个默认对象的概念,它允许您有时隐藏父对象。在Range的情况下,默认父对象为ActiveSheet。如果要在活动工作表上指定范围,则可以直接引用范围,但如果要尝试引用另一个工作表上的范围,则需要提供显式工作表引用。你的两个例子真的没有意义,因为你试图通过引用另一张纸上的范围在一张纸上构建一个范围。这有点像说你想要纽约和波士顿之间的德国部分。

编辑:vacip发现了一个明显的异常现象。 Microsoft documentation明确指出"在没有对象限定符的情况下使用时,此属性[Range]是ActiveSheet.Range"的快捷方式。因此,在下面的代码块中,如果在Sheet 1处于活动状态时运行,则两行应该是等效的,因为第一行是"快捷键"对于第二个:

Sub test()
    Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2)).Value = 1
    ActiveSheet.Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2)).Value = 1
End Sub

但实际发生的是第一行成功改变了非活动工作表上的范围,但第二行失败了。奇。

答案 1 :(得分:1)

似乎VBA正在对不合格的对象做出假设,这可能不是你所假设的。通常,不合格的Range对象将引用活动工作表。但是,如果范围对象是不合格的,并且包含的​​Cells参数是限定的,那么范围对象将由Cells.Worksheet对象限定。

始终最好完全符合资格。例如:

With Sheets(2)
 .Range(.Cells(1, 1), .Cells(2, 2)).Value = "X"
End With

虽然以下也有效:

With Sheets(2)
 Range(.Cells(1, 1), .Cells(2, 2)).Value = "X"
End With

答案 2 :(得分:1)

我认为关键是Range对象可以是applicationworksheet对象的子对象。

John Coleman在他的回答中写道:

  

Microsoft documentation明确指出"在没有使用时使用   对象限定符,此属性[Range]是一个快捷方式   ActiveSheet.Range"

如果你认为"对象限定符"它实际上并没有错。不必是Range对象的父级,但它也可以在其中(sheets(n)Range(Sheets(n).cells(y,x))中的对象限定符),因此可能的情况:

  • Sheets(n).range(cells(y,x))有效且指的是Sheets(n)
  • 中的范围
  • Sheets(n).range(Sheets(n).cells(y,x))也有效,并引用Sheets(n)
  • 中的范围
  • Range(Sheets(n).cells(y,x))也有效且指的是Sheets(n)中的范围 - 此处Range的父级不是activesheet,而是 {{1对象!!
  • application有效且指的是Range(cells(y,x))
  • 中的范围
  • ActiveSheet无效,因为父Sheets(k).range(Sheets(n).cells(y,x))不包含Sheets(k)
  • 中的单元格