等价于“ ThisWorksheet”?

时间:2018-08-08 17:34:23

标签: vba excel-vba

在Excel中,我有一些宏是 Worksheet 模块的一部分。

在代码中,我要确保所引用的范围是该工作表的一部分。

例如,在我的Main Sheet工作表模块中,说我有:

Sub test()
Dim rng as Range
Set rng = Range("A1")
End Sub

当然,我想明确地给工作表指定范围。通常,我会

Set rng = Worksheets("Main Sheet").Range("A1")

但是我很好奇,既然我的代码在工作表模块中,那么如何引用该工作表?我在想类似ThisWorksheet的方法,但这不是VBA中的方法(但是ThisWorkbook是,这就是为什么我想尝试一下的原因。)

我唯一的其他想法是,由于我的宏位于工作表模块中,因此“未分配”范围变量隐式引用Main Sheet,而不能引用任何其他工作表的单元格。

我是否正确理解这一点,或者是否有某种方式可以引用运行代码的工作表?

1 个答案:

答案 0 :(得分:9)

工作表模块是一个文档模块,它与其他任何模块一样都是类,除了它继承(是,继承,如类继承文档模块的唯一方法是通过主机应用程序的对象模型(即Worksheet本质上是工厂方法)。

作为类模块,该模块的工作表对象是ThisWorkbook.Worksheets.Add类的实例,其中包含您放入其中的任何成员 plus < / em>从Sheet1界面继承的每个成员... 包括 Worksheet属性。

因此,在工作表模块中进行不合格的Range调用是指那个工作表的原因,仅仅是因为VBA语言的范围规则-给定以下代码:

Range
  1. 如果该范围中有一个名为foo = Range("B12").Value2 的局部变量,那么Range就是这个变量。

  2. 如果该模块中有一个名为Range的成员,那么Range就是该成员。

  3. 如果当前项目中有一个名为Range的全局变量,那么Range就是这个变量。

  4. 如果在引用的项目或类型库中有一个名为Range的全局范围内的标识符,那么Range就是这种引用。

Members of 'Sheet1' include a 'Range' property, which is a member of the 'Worksheet' class

您可以通过使用Range关键字限定Range调用来消除歧义,该关键字将返回对当前对象的引用,在这种情况下,通过Me接口(仍然假设您已经在Sheet1后面的代码中):

Sheet1

如果您位于foo = Me.Range("B12").Value2 的背后,则该代码将对Sheet1有效,如果您处于{{1}的背后,则该代码将对Sheet1有效},...将无法在标准模块中进行编译。


标准模块中时,不合格的Sheet2调用将遵循完全相同的作用域规则:

  1. 如果该范围中有一个名为Sheet2的局部变量,那么Range就是这个变量。

  2. 如果该模块中有一个名为Range的成员,那么Range就是该成员。

  3. 如果当前项目中有一个名为Range的全局变量,那么Range就是这个变量。

  4. 如果在引用的项目或类型库中有一个名为Range的全局范围内的标识符,那么Range就是这种引用。

    < / li>

(假设在该模块/项目中没有Range标识符的阴影

在这种情况下,可以在隐藏的Range模块中找到全局范围的标识符:

members of '_Global' include a 'Range' property