2017-05-10 167 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