我有一个文件,其中有一个模板表,当它被激活时需要运行一些代码。正在复制此工作表以创建不需要运行此代码的工作表。目前,我有代码在运行时检查工作表的代号,以便它在额外的工作表上不执行任何操作,但是当您在工作表之间切换时它仍然会减慢使用速度。
有什么方法可以使重复的宏也清除它们的 VBA 代码内容?
(编辑)请注意,我需要清除的代码不在模块中。经过一番研究,我似乎找到了一种删除模块的方法(通过访问VBProject.VBComponents
),但我不确定如何访问工作表的 VBA代码。
要删除所有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
您可以解决此问题的另一种方法是将所有代码保留在工作表之外。然后你不必删除任何东西。工作表的代码模块是编写事件代码的便利位置,但您也可以创建自己的类模块来处理事件。把它放在一个标准模块中:
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 的事件,因此激活另一个工作表不会触发代码。