我正在尝试使用 Chip Pearson 的代码从另一个项目的导入覆盖现有的 VBA 代码模块。原始代码在这里。
我正在查看的特定部分是:
With ToVBProject.VBComponents
.Remove .Item(ModuleName)
End With
但是这个VBComponents.Remove
调用有时只会在 VBA 执行停止后才真正生效——也就是说,删除操作直到所有语句都完成后才会生效,或者如果代码遇到断点然后我停止调试。这是一个问题,因为以下代码用于导入新模块或用新模块替换现有模块的代码:
Set VBComp = Nothing
Set VBComp = ToVBProject.VBComponents(CompName)
If VBComp Is Nothing Then
ToVBProject.VBComponents.import filename:=FName
Else
If VBComp.Type = vbext_ct_Document Then
'delete the module's code,
'import a temp module,
'copy over the temp module code,
'delete the temp module
End If
End If
据调试器所知,模块删除尚未生效,因此尚未生效VBComp
。Nothing
所以.import
不会被调用。
即使我注释掉if VBComp.Type = vbext_ct_document then
andend if
以便新模块的代码将覆盖现有的,无论VBComp.Type
它是什么,一旦代码完成执行,模块仍将最终被删除,并且不会发生替换它的导入。
奇怪的是,并非所有模块都会发生这种情况。VBComponents.Remove
有些实际上在通话后被实时删除。
我在各个论坛上看到了几个关于此的不同帖子,但没有令人满意的解决方案。现在我正在使用将.Remove
调用更改为的解决方法:
With ToVBProject.VBComponents
.Item(ModuleName).name = ModuleName & "_remove"
.Remove .Item(ModuleName & "_remove")
End With
这样通过更改名称,ModuleName
似乎不再存在,因此.import
将发生调用。当然,这是假设ModuleName & "_remove"
实际上不存在名为的模块。
有更好的解决方案吗?