3

我有一个文件,其中有一个模板表,当它被激活时需要运行一些代码。正在复制此工作表以创建不需要运行此代码的工作表。目前,我有代码在运行时检查工作表的代号,以便它在额外的工作表上不执行任何操作,但是当您在工作表之间切换时它仍然会减慢使用速度。

有什么方法可以使重复的宏也清除它们的 VBA 代码内容?

(编辑)请注意,我需要清除的代码不在模块中。经过一番研究,我似乎找到了一种删除模块的方法(通过访问VBProject.VBComponents),但我不确定如何访问工作表的 VBA代码

4

2 回答 2

4

要删除所有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
于 2013-03-26T06:17:52.510 回答
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 的事件,因此激活另一个工作表不会触发代码。

于 2013-03-26T13:22:22.120 回答