首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用将Worksheet_activate和_deactivate添加到现有工作表

使用将Worksheet_activate和_deactivate添加到现有工作表
EN

Stack Overflow用户
提问于 2013-04-16 05:21:58
回答 1查看 3.4K关注 0票数 0

我发现了Siddharth Rout用于添加新工作表和代码的伟大代码,但我的需求略有不同。

我要将激活码添加到现有工作表。我尝试使用该表名称来代替使用.Name属性,删除

代码语言:javascript
运行
复制
Set ws = Worksheets.Add

并将ws.Name替换为我现有的工作表名称"Work“。它在这一点上爆炸了。

使用现有示例中的代码检查ws对象时,会发现ws对象的属性名称是一个简单的字符串,因此不能在其中使用现有工作表的名称会让我感到困惑。

原因:

现有工作表"Work“最初是在没有激活码的情况下创建的。在这个多页多功能系统中,它在许多步骤中被大量使用,如果用户手动选择它,我想防止用户更改它--有理由让他在交互暂停期间查看它,做出决定--但当我的VBA来回跳动时,它却不受保护。

因此,我想插入保护工作表的激活代码--移除保护的停用代码可以是工作表的永久部分,不会受到伤害--这样每当用户决定手动查看工作表时,只要我的VBA允许用户交互,就可以保护工作表,然后在用户离开工作表并返回交互时通过其停用来删除/更改该代码,因此它通常可以免费供我的代码使用,否则每次我的代码切换到它时都不会添加保护。

我将在那里创建并永久保留取消保护的停用代码--这不会有什么坏处--这样它就不会改变自己(这是一个可怕的禁忌)。多么?

很抱歉说了这么多话。我在VBA中用谷歌搜索“自修改代码”,但没有找到好的答案。

EN

回答 1

Stack Overflow用户

发布于 2013-04-16 06:24:57

如果您只想临时捕获其他工作表上的事件,则可以使用类模块。如果您想永久地将代码添加到工作表代码中,则需要使用@Sorceri提到的VBA可扩展性内容。

使用类模块捕获工作簿的事件

在类模块中(名称: SheetEvent)

代码语言:javascript
运行
复制
Public WithEvents Sheet As Worksheet

Public Sub Capture(ByVal Worksheet As Worksheet)
Set Sheet = Worksheet
End Sub

Private Sub Class_Terminate()
Set Sheet = Nothing
End Sub

Private Sub Sheet_Activate()
Debug.Print "Sheet_Activate Fired! (Sheet:" & Sheet.Name & ")"
End Sub

Private Sub Sheet_Change(ByVal Target As Range)
Debug.Print "Sheet_Activate Fired! (Sheet:" & Sheet.Name & " Target:" & Target.Address & ")"
End Sub

Private Sub Sheet_Deactivate()
Debug.Print "Sheet_Deactivate Fired! (Sheet:" & Sheet.Name & ")"
End Sub

在模块中:

代码语言:javascript
运行
复制
Public S As SheetEvent

Sub Main()
Set S = New SheetEvent
S.Capture ThisWorkbook.Worksheets("Sheet1")

End Sub

这种方法的问题是,如果您的VBA出现错误或您停止执行,则需要重新启动它。

使用上面的示例,如果您运行Main(),然后在Sheet1和Sheet2之间来回切换,或者更改Sheet1中的任何单元格,您将在“即时”窗口中收到一条消息。

如果在工作表之间“跳转”意味着您正在激活工作表以读取(或设置一些单元格),然后重新激活前一个工作表,您可能会发现使用工作表对象更容易(也更快)。

代码语言:javascript
运行
复制
Dim Sheet1 As Worksheet
Dim Sheet2 As Worksheet

Set Sheet1 = ThisWorkbook.Worksheets("Sheet1")
Set Sheet2=  ThisWorkbook.Worksheets("Sheet2")

使用上面的代码,您可以通过这两个对象访问sheet1和sheet2中的数据。不需要先激活任何一个(即使是隐藏的)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16024905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档