在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
,而不能引用任何其他工作表的单元格。
我是否正确理解这一点,或者是否有某种方式可以引用运行代码的工作表?
答案 0 :(得分:9)
工作表模块是一个文档模块,它与其他任何模块一样都是类,除了它继承(是,继承,如类继承({1})接口中的成员,并且是文档模块的唯一方法是通过主机应用程序的对象模型(即Worksheet
本质上是工厂方法)。
作为类模块,该模块的工作表对象是ThisWorkbook.Worksheets.Add
类的实例,其中包含您放入其中的任何成员 plus < / em>从Sheet1
界面继承的每个成员... 包括 Worksheet
属性。
因此,在工作表模块中进行不合格的Range
调用是指那个工作表的原因,仅仅是因为VBA语言的范围规则-给定以下代码:
Range
如果该范围中有一个名为foo = Range("B12").Value2
的局部变量,那么Range
就是这个变量。
如果该模块中有一个名为Range
的成员,那么Range
就是该成员。
如果当前项目中有一个名为Range
的全局变量,那么Range
就是这个变量。
如果在引用的项目或类型库中有一个名为Range
的全局范围内的标识符,那么Range
就是这种引用。
您可以通过使用Range
关键字限定Range
调用来消除歧义,该关键字将返回对当前对象的引用,在这种情况下,通过Me
接口(仍然假设您已经在Sheet1
后面的代码中):
Sheet1
如果您位于foo = Me.Range("B12").Value2
的背后,则该代码将对Sheet1
有效,如果您处于{{1}的背后,则该代码将对Sheet1
有效},...将无法在标准模块中进行编译。
在标准模块中时,不合格的Sheet2
调用将遵循完全相同的作用域规则:
如果该范围中有一个名为Sheet2
的局部变量,那么Range
就是这个变量。
如果该模块中有一个名为Range
的成员,那么Range
就是该成员。
如果当前项目中有一个名为Range
的全局变量,那么Range
就是这个变量。
如果在引用的项目或类型库中有一个名为Range
的全局范围内的标识符,那么Range
就是这种引用。
(假设在该模块/项目中没有Range
标识符的阴影)
在这种情况下,可以在隐藏的Range
模块中找到全局范围的标识符: