Vba &引用;本工作表;相等的
在Excel中,我有一些宏是工作表模块的一部分 在代码中,我希望确保引用的范围是该工作表的一部分 例如,在我的Vba &引用;本工作表;相等的,vba,excel,Vba,Excel,在Excel中,我有一些宏是工作表模块的一部分 在代码中,我希望确保引用的范围是该工作表的一部分 例如,在我的主工作表工作表模块中,假设我有: Sub test() Dim rng as Range Set rng = Range("A1") End Sub 当然,我想明确给出工作表的范围。通常,我会这样做 Set rng = Worksheets("Main Sheet").Range("A1") 但我很好奇,因为我的代码在一个工作表模块中,我如何引用该工作表?我在想类似于ThisWork
主工作表工作表模块中,假设我有:
Sub test()
Dim rng as Range
Set rng = Range("A1")
End Sub
当然,我想明确给出工作表的范围。通常,我会这样做
Set rng = Worksheets("Main Sheet").Range("A1")
但我很好奇,因为我的代码在一个工作表模块中,我如何引用该工作表?我在想类似于ThisWorksheet
的东西,但这不是VBA中的方法(但是ThisWorksheet
是,这就是我想尝试它的原因)
我唯一的其他想法是,由于我的宏位于工作表模块内,“未分配”范围变量隐式引用主工作表
,不能引用任何其他工作表的单元格
我是否正确理解了这一点,或者是否有某种方法可以引用运行代码的工作表?工作表模块是一个文档模块,它与任何其他模块一样是类,只是它从工作表
接口继承(是的,继承,如同类内继承!)成员,作为文档模块,创建其实例的唯一方法是通过宿主应用程序的对象模型(即ThisWorkbook.Worksheets.Add
基本上是一种工厂方法)
作为类模块,该模块的工作表对象是Sheet1
类的一个实例,该类包含您放入其中的任何成员,以及从工作表
接口继承的每个成员包括a范围
属性
因此,工作表模块中的非限定范围调用引用该工作表的原因很简单,因为VBA语言的作用域规则-给定以下代码:
foo = Range("B12").Value2
如果在该范围内有一个名为Range
的局部变量,那么这就是Range
所指的
如果模块中有一个名为Range
的成员,那么Range
就是指这个成员。
如果当前项目中有一个名为Range
的全局变量,那么Range
就是指这个变量
如果在名为Range
的引用项目或类型库中有一个全局范围的标识符,那么Range
就是指这个标识符
您可以通过使用Me
关键字限定Range
调用来消除它的歧义,该关键字返回对当前对象的引用,在本例中通过Sheet1
接口(仍然假设您在Sheet1
的代码后面):
如果您在Sheet1
的代码隐藏中,则该代码将对Sheet1
起作用,如果您在Sheet2
的代码隐藏中,则该代码将对Sheet2
起作用……并且将无法在标准模块中编译
但是Me
的性质和含义值得更多的关注
关于“我”
Me
是一个保留名称(不能使用该名称的变量),它指的是只能在运行时存在于过程作用域中的某个对象:当前对象。在引擎盖下,当您针对Class1
对象对DoSomething
进行成员调用时,调用基本上如下所示:
Set obj = New Class1
Class1.DoSomething obj
Public Sub DoSomething(ByVal Me As Class1)
End Sub
这意味着DoSomething
在VBA中看起来像这样:
Public Sub DoSomething()
End Sub
但VBA是这样看的:
Set obj = New Class1
Class1.DoSomething obj
Public Sub DoSomething(ByVal Me As Class1)
End Sub
这使得Me
成为Class1
类型的隐式局部作用域ByVal
参数,并且在DoSomething
作用域内,它持有调用方当前使用的任何对象的引用
这基本上是我文章的核心=)
()
在标准模块中,非限定的范围调用遵循完全相同的范围规则:
如果在该范围内有一个名为Range
的局部变量,那么这就是Range
所指的
如果模块中有一个名为Range
的成员,那么Range
就是指这个成员
如果当前项目中有一个名为Range
的全局变量,那么Range
就是指这个变量
如果在名为Range
的引用项目或类型库中有一个全局作用域标识符,则这就是Range
所指的。
(假设该模块/项目中没有出现范围标识符的阴影)
在这种情况下,全局范围的标识符可以在隐藏的Global
模块中找到:
由于您的代码位于工作表的代码模块中,因此您可以使用关键字Me来引用该工作表--Set rng=Me.Range(“A1”)
。虽然没有必要,但它确实让您可以访问IntelliSense。@Domenic-Aha!这似乎是答案,请随意创建一个答案,我可以标记它。(我还假设您不能在工作簿模块中使用Me
,或者如果可以,则Me
基本上指的是thiswoolk
?)。如果没有Me
,我的假设是否正确,因为有一个对工作表的隐式引用只有Range()
?或者理论上,如果工作表处于活动状态,它还会引用另一个工作表吗?@BruceWayne-在工作簿中模块Range()
将引用任何工作表处于活动状态,因此如果需要,您需要显式。如果您正在使用工作簿
模块中的任何工作表
事件,则可以使用从事件参数传递的sh
变量。Me
指当前对象,因此如果您在thishworkbook
的代码隐藏中,则它指的是thishworkbook
;-)哇哦!!!这是一个非常棒的回答,非常感谢您的帮助和花在写作上的时间