我正在运行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)。 我可以看到许多人遇到了同样的问题,但是提出的解决方案都没有对我有用。不知道为什么会这样? 请指教。
答案 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的代码模块。 从长远来看,任何给出的暗示证明不可靠,因此只是猜测。由于这种现象如上所述是不可预测的,你永远不能真正说出这个伎俩。