2013-03-26 43 views
2

我有一个文件,里面有一个模板表,当它激活时需要运行一些代码。此工作表正在被复制以创建工作表,不需要需要运行此代码。目前,我有代码在运行时检查工作表的代号,以便它在额外的工作表上不做任何事情,但是当您在工作表之间切换时,它仍然会降低使用率。如何通过宏清除工作表的VBA代码?

有没有什么办法可以让宏使复制也清除他们的VBA代码内容?

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

+0

如果你只是想摆脱整个VBA代码,你可以简单地将其保存为'.xlsx'文件,并将完成。 – 2013-03-26 05:43:42

+0

@KazJaw:这不是一个选项,因为工作簿有许多其他必需的宏。 – 2013-03-26 05:48:57

+0

@ user2063626我在问如何删除工作表的VBA *代码*。为了避免混淆,我重新提出了这个问题。 – 2013-03-26 05:50:06

回答

2

要取出完整的代码在所有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 
+0

是的,这与解决问题的方式大致相同,只是我刚刚找到的问题(在上述问题的评论中发布)。但它确实有一些新的信息会在稍后使用。谢谢! – 2013-03-26 06:21:27

+2

有关可能会稍后使用此功能的其他说明:要使其发挥作用,您需要在Excel安全设置中启用“信任访问VBA项目对象模型”。 – 2013-03-26 06:23:35

+0

有可能删除单个过程而不是删除模块中的整个代码。但它需要更多的编码。 – 2013-03-26 06:24:40

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的事件,因此激活另一个工作表不会触发代码。

+0

谢谢!这是一个非常有趣的解决方案。我会尽力实施它。 – 2013-03-28 06:51:38