在选择 Visio 文件后但在打开它之前从中删除错误的 VBA 代码

Remove bad VBA code from Visio file after it is selected but before it is opened

我有一组 Visio 绘图文件,其中包含不再需要的 VBA 代码(实际上,尝试打开文件时会出现错误,因为 VBA no 中引用的模块不再存在)。

由于我正在开发的插件的性质,我的用户必须启用宏和 VBA。但是,他们在 Visio 中打开的任何文件都需要先自动删除其 VBA 代码。

我可以在启动 Visio 应用程序时但在选择打开文件之前在我的代码中设置断点。在 Visio 中选择并加载文件后,我还可以在代码中设置断点。在选择文件之后,但在 Visio 加载文件之前,我似乎找不到中断的方法。

查看 C# 中的 Visio Interop 程序集,我可以看到 Visio.Application 个名为 "OnDocumentOpened" 和 "OnDocumentCreated" 的事件,但它们直到 'after' 文件才被触发已加载。不幸的是,我找不到任何名为 "BeforeDocumentOpened" 或 "BeforeDocumentCreated" 的东西,这基本上正是我所需要的。还有其他具有类似名称的事件,例如 "BeforeDocumentSave" 和 "BeforeDocumentClose",但显然它们不是我要找的。

如有任何帮助,我们将不胜感激。

我的问题:是否有任何方法可以在 Visio 尝试打开绘图文件但实际打开之前进行捕获?这是我打算从文件中删除 VBA 代码的地方,我已经实现了。如果没有,是否有任何已知的解决方法来实现类似的目标?

不好的例子VBA我要删除:

Private Sub Document_DocumentCreated(ByVal doc As Visio.Document)
    Call Initialize(doc)
End Sub

Private Sub Document_DocumentOpened(ByVal doc As Visio.Document)
    Call Initialize(doc)
End Sub

Private Sub Initialize(doc As Visio.Document)
    Dim myLib As Object
    Set myLib = CreateObject("MODULE_NAME") 'Errors here, since we got rid of the module
    ...
End Sub

我不会过度。您可以升级您的用户。比如,提供一个脚本(或安装程序中的某种功能,或应用程序中的某个按钮)来更新图表。 IE。一个单独的功能,只是不要在打开图表时这样做。既然是一次性操作,估计用户也不会哭。而且您不会向应用程序添加 "garbage" 一次性代码...

明确一点:您正在寻找的活动"before document opened"不存在。

关于 Visio 中 VBA 宏的另一个提示:将代码放入模具中。当您在图纸中添加代码时,它会在 个创建的图纸中激增。如果要改代码,那就得把所有的图纸都找回来,把所有的代码都改了。

相反,您可以将宏放入模具中。模具可以放在用户的收藏夹文件夹中,因此可以从任何绘图中轻松访问模具(形状 > 更多形状 > 我的形状 > 收藏夹,通常位于左侧停靠的面板中)。

模板不必包含任何母版形状,它可以作为一个 "code library" 供用户加载以用于任何绘图。但它是一个单独的文件。如果您需要更新宏,则可以分发新模板并让用户覆盖旧模板。

现在您的所有 绘图文件 都将没有代码,并且您不必在每次需要更改时更新潜在的数千个 VBA 项目.