VBA-使用变量引用对象

VBA-使用变量引用对象,vba,excel,Vba,Excel,不确定如何使用每次激活工作表时都会更改的变量引用工作表对象 重点是根据上次激活的工作表引用单元格值(此代码影响激活时未设置变量的Sheet1) 更新: 谢谢你的指导,但你的指示至少对我的项目不起作用 表5.范围(“C4”).值=工作表(MYW).范围(“A2”).值 在表5上执行上述代码时,下标超出范围错误 MyWS被声明为公共字符串。 激活Sheet5时,会为MyWS分配Sheet5.CodeName字符串。Sheet5存在,这是工作表的未修改代码名。我不能使用工作表的用户定义名称,因为这可能

不确定如何使用每次激活工作表时都会更改的变量引用工作表对象

重点是根据上次激活的工作表引用单元格值(此代码影响激活时未设置变量的Sheet1)

更新:

谢谢你的指导,但你的指示至少对我的项目不起作用

表5.范围(“C4”).值=工作表(MYW).范围(“A2”).值

在表5上执行上述代码时,下标超出范围错误

MyWS被声明为公共字符串。
激活Sheet5时,会为MyWS分配Sheet5.CodeName字符串。Sheet5存在,这是工作表的未修改代码名。我不能使用工作表的用户定义名称,因为这可能会更改

评论中提到的使用ActiveSheet的
确实是最好的解决方案


但是,如果您想“按自己的方式”进行操作,请在每个工作表中编写以下
激活
事件:

Private Sub Worksheet_Activate()
    lastWS = Me.Name
End Sub
然后,
lastWs
将是活动表的名称。您可以这样引用它
工作表(lastWs)
。因此:


Sheet1.Range(“A3”).Value=工作表(lastWs).Range(“A3”).Value
公共MyWS-As-String
声明一个
字符串
变量,而不是对象

代号
CodeName
属性返回一个
字符串
,该字符串包含VBA用于为
工作表
生成项目范围对象变量的标识符;在属性工具窗口(F4)中,这是
(名称)
属性

这就是此类代码的合法性:

Sheet1.Range("A3").Value = 42
因为
Sheet1
有一个返回
Sheet1
的代码名字符串。请注意,此标识符不一定是工作表的名称(默认情况下是这样),用户可以随时更改该名称,而无需访问Visual Basic编辑器

因此,如果您将“Sheet1”选项卡/工作表重命名为“Summary”,但不更改其代码名,则代码中仍将是
Sheet1
,因此这两个说明的作用完全相同:

Sheet1.Range("A3").Value = 42
ThisWorkbook.Worksheets("Summary").Range("A3").Value = 42
现在,如果您想要一个对象变量保存对编译时存在的工作表的引用,那么您已经有了一个-
Sheet1
就是这样

如果在运行时添加了一个工作表(编译时不存在),那么该工作表就没有这样的项目范围对象变量;此时,您需要声明自己的,并使用
Set
关键字指定:

Dim someSheet As Worksheet
Set someSheet = ThisWorkbook.Worksheets.Add

活动表 Excel对象模型还有
ActiveSheet
对象,它返回当前活动的任何工作表

Sheet1.Range("A3").Value = ActiveSheet.Range("A3").Value
请注意显式限定符。如果是在标准模块(.bas)中编写的,则此代码相当于:

Sheet1.Range("A3").Value = Range("A3").Value
如果是在特定工作表模块的代码隐藏中编写的,则上述代码将执行以下操作:

Sheet1.Range("A3").Value = Me.Range("A3").Value
其中,
Me
是您所在的特定工作表模块,因此,如果您在工作表模块中编写该代码,则需要使用
ActiveSheet
对象明确限定
范围
成员调用


工作表事件 如果在激活工作表时需要执行代码,可以在
ThisWorkbook
模块中处理
SheetActivate
事件:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim sheet As Worksheet
    If TypeOf Sh Is Worksheet Then 
        Set sheet = Sh
    Else
        'Sh is not a worksheet. could be a chart sheet, or something else.
        Exit Sub
    End If

    Debug.Print sheet.Name & " activated!"

End Sub
如果需要处理编译时存在的特定工作表的
Activated
事件,则需要在该工作表的代码隐藏中为其提供事件处理程序:

Private Sub Worksheet_Activate()
    Debug.Print Me.Name & " activated!"
End Sub
如果需要为运行时创建的工作表处理该事件,则需要类模块(.cls)中的
WithEvents
对象变量:


然后,您可以在该模块中为
MySheet\u Activate
编写一个处理程序,但这是更高级的东西,我在这里几乎没有触及表面,但这应该可以让您继续:)

使用Activesheet?--Module1公共MyWS作为工作表--Sheet3(停用)Set MyWS=Activesheet--Sheet2(停用)设置MyWS=ActiveSheet--Sheet1 Sheet1.Range(“A3”)。Value=MyWS.Range(“A3”)。Value似乎对我不起作用。如果这是VBA,为什么要将其标记为VB.NET?此外,如果您需要在事后发布代码,请编辑您的问题。正如您所看到的,它在注释中几乎不可读,尤其是在完全没有格式化的情况下。
如果Sh是工作表,那么
现在看起来真的很像Python语法。:)<代码>?ActiveWorkbook.Worksheets(1)是即时窗口中的工作表
,生成运行时错误“424”:需要对象。所以我不认为
Is
可以这样使用……你一定是这个意思。
Private Sub Worksheet_Activate()
    Debug.Print Me.Name & " activated!"
End Sub
Private WithEvents MySheet As Worksheet