我有一个文件,其中有一个模板表,需要在激活时运行一些代码。正在复制此工作表以创建不需要运行此代码的工作表。目前,我有代码在运行时检查工作表的代号,以便它不会在额外的工作表上执行任何操作,但是当您在工作表之间切换时,它仍会减慢使用率。
有没有办法让制作重复项的宏也清除他们的VBA代码内容?
(编辑)请注意我需要清除的代码不在模块中。经过一些研究,似乎我找到了一种删除模块的方法(通过访问VBProject.VBComponents
),但我不确定如何访问工作表的VBA 代码。
答案 0 :(得分:3)
要删除所有Sheet
模块中的完整代码,您可以尝试以下方法:
Sub Remove_some_vba_code()
Dim activeIDE As Object 'VBProject
Set activeIDE = ActiveWorkbook.VBProject
Dim Element As VBComponent
Dim LineCount As Integer
For Each Element In activeIDE.VBComponents
If Left(Element.Name, 5) = "Sheet" Then 'change name if necessary
LineCount = Element.CodeModule.CountOfLines
Element.CodeModule.DeleteLines 1, LineCount
End If
Next
End Sub
答案 1 :(得分:2)
您可以采用的另一种方法是将所有代码保留在工作表之外。然后你不必删除任何东西。工作表的代码模块是编写事件代码的便利位置,但您也可以创建自己的类模块来处理事件。把它放在标准模块中:
Public gclsEvent As CEvent
Sub Auto_Open()
Set gclsEvent = New CEvent
Set gclsEvent.This = Sheet1
End Sub
这将创建一个全局的CEvent实例,因此只要您的工作簿处于打开状态,它就不会丢失范围。它将代号为Sheet1的工作表分配给该类的This属性。使用此代码
创建名为CEvent的类模块Private WithEvents mwsThis As Worksheet
Public Property Set This(ByVal wsThis As Worksheet): Set mwsThis = wsThis: End Property
Public Property Get This() As Worksheet: Set This = mwsThis: End Property
Private Sub mwsThis_Activate()
Me.This.Copy , Me.This.Parent.Sheets(Me.This.Parent.Sheets.Count)
End Sub
WithEvents关键字公开该对象的事件。由于我们只是连接Sheet1的事件,因此激活另一个工作表不会触发代码。