"ThisWorksheet"相当于?

Bru*_*yne 10 vba excel-vba

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

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

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

Sub test()
Dim rng as Range
Set rng = Range("A1")
End Sub
Run Code Online (Sandbox Code Playgroud)

当然,我想明确给出工作表范围.通常情况下,我会这样做

Set rng = Worksheets("Main Sheet").Range("A1")
Run Code Online (Sandbox Code Playgroud)

但我很好奇,因为我在工作表模块中有我的代码,我怎么能参考那个工作表?我在考虑类似的东西,ThisWorksheet但这不是VBA中的一种方法(但是ThisWorkbook,这就是为什么我想尝试它).

我唯一的另一个想法是,由于我的宏在工作表模块中,"未分配"范围变量隐式引用Main Sheet并且不能引用任何其他工作表的单元格.

我是否理解正确,或者是否有某种方法可以参考运行代码的工作表?

Mat*_*don 13

工作表模块是一个文档模块,它类似于任何其他类,除了它从接口继承(是的,继承,如类继承!)成员Worksheet,并且作为文档模块创建它的实例的唯一方法是通过宿主应用程序的对象模型(即ThisWorkbook.Worksheets.Add本质上是一种工厂方法).

作为一个类模块,该模块的工作表对象是一个例子,比方说,在Sheet1类,它包含你把任何成员进去,再加上每个成员从继承的Worksheet接口...... 包括一个Range属性.

因此,Range工作表模块中的非限定调用引用表的原因仅仅是因为VBA语言的作用域规则 - 给定此代码:

foo = Range("B12").Value2
Run Code Online (Sandbox Code Playgroud)
  1. 如果在该范围内有一个局部变量命名Range,那么这就是Range所指的.

  2. 如果该模块中有一个成员命名Range,那么这就是Range所指的那个.

  3. 如果当前项目中有一个全局变量Range,那就是Range所指的那个.

  4. 如果引用的项目或类型库中有一个全局范围的标识符Range,那么这就是Range所指的.

'Sheet1'的成员包含'Range'属性,它是'Worksheet'类的成员

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

foo = Me.Range("B12").Value2
Run Code Online (Sandbox Code Playgroud)

该代码将开始处理Sheet1,如果你在代码隐藏Sheet1,和对Sheet2如果你在代码隐藏Sheet2,...并会失败标准模块中进行编译.


当您使用标准模块时,不合格的Me调用遵循完全相同的范围规则:

  1. 如果在该范围内有一个局部变量命名Me,那么这就是DoSomething所指的.

  2. 如果该模块中有一个成员命名Class1,那么这就是DoSomething所指的那个.

  3. 如果当前项目中有一个全局变量Me,那就是ByVal所指的那个.

  4. 如果引用的项目或类型库中有一个全局范围的标识符Class1,那么这就是DoSomething所指的.

(假设没有遮蔽的的Range标识符在该模块/项目发生的)

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

'_Global'的成员包括'Range'属性

  • 这是我不喜欢隐式引用的一个重要原因 - 它们没有帮助[使错误的代码看起来错误](https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong /).在将代码转换为标准模块或不兼容的类/文档类时,一致地使用"Me"进行所有成员访问的限定将会出错,并为轻松重构铺平了道路. (2认同)