2013-03-26 83 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