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
andをコメントアウトしてend if
、新しいモジュールのコードが既存のモジュールを上書きするようVBComp.Type
にしても、コードの実行が終了するとモジュールは削除されてしまい、それを置き換えるインポートは発生しません。
奇妙なことに、これはすべてのモジュールで発生するわけではありません。通話後にリアルタイムで実際に削除されるものもありVBComponents.Remove
ます。
さまざまなフォーラムでこれに関するいくつかの異なる投稿を見てきましたが、満足のいく解決策はありません。今のところ、.Remove
呼び出しを次のように変更する回避策を使用しています。
With ToVBProject.VBComponents
.Item(ModuleName).name = ModuleName & "_remove"
.Remove .Item(ModuleName & "_remove")
End With
名前を変更ModuleName
すると、 が存在しないように見えるため、.import
呼び出しが発生します。もちろん、これは、という名前のモジュールがModuleName & "_remove"
実際に存在しないことを前提としています。
より良い解決策はありますか?