Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba &引用;本工作表;相等的_Vba_Excel - Fatal编程技术网

Vba &引用;本工作表;相等的

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

在Excel中,我有一些宏是工作表模块的一部分

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

例如,在我的
主工作表
工作表模块中,假设我有:

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
    ;-)哇哦!!!这是一个非常棒的回答,非常感谢您的帮助和花在写作上的时间