【问题标题】:How to clear the VBA code of a worksheet via a macro?如何通过宏清除工作表的 VBA 代码?
【发布时间】:2013-03-26 05:31:19
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您只是想摆脱整个 vba 代码,您只需将其保存为“.xlsx”文件即可。
  • @KazJaw:这不是一个选项,因为工作簿还有许多其他必要的宏。
  • @user2063626 我在问如何删除工作表的 VBA code。我重新表述了这个问题以避免混淆。
  • 所以我猜你想删除触发sheet_activate事件的代码?可以吗??
  • 经过一番挖掘,我设法找到了答案。看起来VBComponents 对象的代码可以通过.CodeModule 属性访问。这是我用来测试这个想法的代码:ThisWorkbook.VBProject.VBComponents.Item("TestSheet").CodeModule.DeleteLines 1, _ ThisWorkbook.VBProject.VBComponents.Item("TestSheet").CodeModule.CountOfLines。在这种情况下,TestSheet 是我正在删除的代码的工作表的CodeName。宏工作,成功删除代码。

标签: vba excel


【解决方案1】:

要删除所有 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

【讨论】:

  • 是的,这与我刚刚找到的解决问题的方法大致相同(上面在 cmets 中发布了问题)。但它确实有一些新的信息,以后会有用。谢谢!
  • 对以后可能使用此功能的人的附加说明:为了使其正常工作,您需要在 Excel 安全设置中启用“信任对 VBA 项目对象模型的访问”。
  • 有可能删除单个过程而不是删除模块中的整个代码。但它需要更多的编码。
  • 是的,我想我们可以搜索 Sub / End Sub 并使用这些行号来区分程序。感谢您的通知。
【解决方案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 的事件,因此激活另一个工作表不会触发代码。

【讨论】:

  • 谢谢!这是一个非常有趣的解决方案。我也会尝试实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多