2017-05-10 195 views
0

我正與幾位同事共享工作表。該電子表格最終會發送給外部方,因此我們將作爲宏的一部分以編程方式刪除VBE模塊。我用這個代碼是由微軟的文檔採取:刪除模塊Excel VBA時運行時錯誤'9'

Dim vbCom As Object 

    Set vbCom = Application.VBE.ActiveVBProject.VBComponents 

    vbCom.Remove VBComponent:= vbCom.Item("sample_module") 

它適用於一些用戶,但我得到運行時錯誤「9」與他人。腳本的其餘部分最終會執行,但模塊不會被刪除。

+0

RTE 9的意思是「這個項目不存在」 - 如果沒有名爲'sample_module'的'VBComponents'採集模塊,那麼沒有什麼可以刪除的。 –

+0

另外,如果腳本的其餘部分執行完畢,您可能會在某處出現「On Error Resume Next」,這可能是一個糟糕的主意。 –

+0

雖然有一個sample_module。有些用戶會遇到錯誤,有些則不會。對於沒有出現錯誤的用戶,該模塊將被刪除。我在腳本中也沒有任何On Error Resume Next。我覺得我沒有正確引用模塊,但我不知道如何解決它。 –

回答

1

嘗試運行與下面的For Each vbCom In .VBComponents循環的代碼,看看你會得到什麼:

Option Explicit 

Sub CheckVBProjComp() 

Dim vbCom As Object 
Dim flag As Boolean 
Dim VbComName As String 

VbComName = "sample_module" 

With ThisWorkbook.VBProject 
    For Each vbCom In .VBComponents 
     If vbCom.Name Like VbComName Then 
      .VBComponents.Remove .VBComponents(vbCom.Name) 
      flag = True 
      Exit For 
     End If 
    Next vbCom 
End With 

If flag Then 
    MsgBox "VB Component " & Chr(34) & VbComName & Chr(34) & " successfully removed", vbOKOnly 
Else 
    MsgBox "Unable to find VB Component " & Chr(34) & VbComName & Chr(34), vbInformation 
End If 

End Sub 
+1

用於消除「ActiveVBProject」歧義的榮譽。 –

+0

感謝您的協助。這工作得很好。該錯誤不再顯示。 –

+0

@WalterWhalen歡迎您通過點擊我的答案 –

0

您需要添加對VBA擴展性庫的引用,並在運行這些命令的每個客戶端上啓用「對Visual Basic項目的信任訪問」。你可以看到從芯片此頁面與一個偉大的崩潰:http://www.cpearson.com/excel/vbe.aspx

+0

我以爲我是在設置vbCom的時候。我也已經有用戶啓用信任訪問。我應該改變我的vbCom參考嗎? –

+0

@WalterWhalen no。您的代碼正在對VBIDE API進行後期調用,因爲您聲明瞭「vbCom As Object」。 –

0

如果目標僅僅是去除所有模塊一個給定的Excel工作簿,然後解決WorkbookVBProject,不要假設VBE.ActiveVBProject將成爲您定位的工作簿背後的項目。

此過程條從指定target所有非文檔模塊:

Public Sub RemoveAllMacros(ByVal target As Workbook) 

    'if the target is ThisWorkbook, we're removing the very macro we're running! 
    If target Is ThisWorkbook Then Exit Sub 

    Dim components As VBComponents 
    Set components = target.VBProject.VBComponents 

    Dim component As VBComponent 
    For Each component In components 
     If component.Type <> vbext_ct_Document Then components.Remove component 
    Next 

End Sub