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