VBA:如何用随激活变化的变量引用工作表对象
问题:动态引用最后激活的工作表对象
我现在碰到个VBA的小麻烦——每次切换工作表时,用来记录激活表的变量总是没法正确用来引用工作表对象。我的需求是基于最后激活的工作表,把它A3单元格的值同步到Sheet1的A3里,但目前的代码只能固定针对Sheet1,而且Sheet1激活的时候根本不会更新那个变量。
我目前的代码结构:
- 模块Module1中的公共变量声明:
Public MyWS as String
- Sheet3的Deactivate事件代码:
MyWS = Sheet3.Codename
- Sheet2的Deactivate事件代码:
MyWS = Sheet2.Codename
- Sheet1里的赋值代码:
Sheet1.Range("A3").Value = MyWS.Range("A3").Value
解决方案
其实问题出在两个关键点上:一是你把MyWS定义成了字符串类型,存的是工作表的代码名,但字符串没法直接调用.Range方法;二是Sheet1本身没有触发变量更新的逻辑,导致切换到Sheet1时MyWS不会同步。
具体调整步骤:
- 修改变量类型为工作表对象
把Module1里的声明改成工作表对象类型,这样后续直接就能用它操作单元格:
' Module1中的声明 Public MyWS As Worksheet
- 给所有工作表添加激活事件
不管是Sheet1、Sheet2还是Sheet3,都在它们的Activate事件里把MyWS指向当前激活的工作表(用Me指代当前工作表就行):
' Sheet1的Activate事件代码 Private Sub Worksheet_Activate() Set MyWS = Me End Sub ' Sheet2的Activate事件代码 Private Sub Worksheet_Activate() Set MyWS = Me End Sub ' Sheet3的Activate事件代码 Private Sub Worksheet_Activate() Set MyWS = Me End Sub
- 修正Sheet1中的赋值代码
现在MyWS已经是有效的工作表对象了,直接调用它的Range就行:
Sheet1.Range("A3").Value = MyWS.Range("A3").Value
这样调整后,不管你切换到哪个工作表,MyWS都会自动更新为最后激活的那个表,Sheet1的赋值逻辑也能正确同步目标单元格的值了。
内容的提问来源于stack exchange,提问作者x189
相关产品推荐
相关产品推荐

