无法通过VBA从目标工作簿中删除代码模块

我正在运行一个Excel 2010macros,可以打开另一个工作簿并删除一些代码模块(一个表单和一个BAS模块)。 之后,重新导入它们作为更新的版本。 这是代码:

For Each x In destination_wb.VBProject.VBComponents If LCase(x.Name) Like LCase("frmCCLogin*") Or _ LCase(x.Name) Like LCase("modCQ_test*") Then destination_wb.VBProject.VBComponents.Remove (x) Next 

我对导入没有问题,但删除过程并不总是按预期工作。 由于某些原因,BAS(modCQ_test.bas)模块并不总是被删除。 因此,当我重新导入时,会创build一个以“1”结尾的新复制模块(即modCQ_test1.bas)。 我可以看到很多人都遇到同样的问题,但是没有一个提出的解决scheme为我工作。 不知道为什么发生这种情况? 请指教。

如果您可以使用模块的确切名称,则可以编写如下所示的内容:

 Public Sub RemoveComponent(ByVal Book As Workbook, ByVal Name As String) On Error Resume Next With Book.VBProject.VBComponents Call .Remove(.Item(Name)) End With End Sub 

如果你用通配符匹配(即SomeName *),你可以迭代VBComponents集合,并将名称caching到一个集合或数组或任何其他名称,并为每个匹配的名称调用上面的函数。

另外,如果你想枚举VBComponents集合并像你的代码示例一样删除,我build议你按照相反的顺序进行。

所以像这样:

 Public Sub RemoveComponent1(ByVal Book As Workbook, ByVal NameSearch As String) Dim oCompS As VBComponents Dim oComp As VBComponent Dim i As Integer Set oCompS = Book.VBProject.VBComponents For i = oCompS.Count To 1 Step -1 Set oComp = oCompS(i) If oComp.Name Like NameSearch Then Call oCompS.Remove(oComp) Next End Sub 

我已经经历了完全相同的现象,它已经让我疯狂了几个星期了。 我确实检查了代码模块在删除后是否已经被直接删除了,虽然它已经从VBE的Project View中消失了,但它仍然存在,因此随后的导入会创build一个名为xxx1的代码模块。 从长远来看,所给出的任何提示都certificate是不可靠的,因此只不过是猜测罢了。 由于这种现象是不可预测的,所以你永远无法分辨出是什么技巧。

问题解决了。 这个简单的代码隐藏了目标工作簿,在我的情况下解决了重复问题:

 destination_wb.Windows(1).Visible = False 

之后,您可以删除,然后添加组件。 不会发生重复。