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

时间:2015-11-12 23:11:06

标签: excel vba

我正在运行Excel 2010宏,它打开另一个工作簿并删除一些代码模块(表单和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)模块。因此,当我重新导入时,会创建一个以" 1"结尾的新复制模块。 (即modCQ_test1.bas)。 我可以看到许多人遇到了同样的问题,但是提出的解决方案都没有对我有用。不知道为什么会这样? 请指教。

3 个答案:

答案 0 :(得分:1)

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

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集合并将名称缓存到集合或数组或其他任何内容中,并为每个匹配的名称调用上面的函数。

此外,如果您希望枚举VBComponents集合并删除代码示例,我建议您按相反的顺序进行。

类似于:

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

答案 1 :(得分:1)

问题已解决。这个简单的代码行隐藏了目标工作簿,修复了我的案例中的复制问题:

destination_wb.Windows(1).Visible = False

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

答案 2 :(得分:0)

我经历了完全相同的现象,它已经让我疯了几个星期了。 我确实检查了代码模块是否在删除后直接删除了,虽然它已从VBE的项目视图中消失,但它仍然存在,因此后续导入会创建一个名为xxx1的代码模块。 从长远来看,任何给出的暗示证明不可靠,因此只是猜测。由于这种现象如上所述是不可预测的,你永远不能真正说出这个伎俩。