繁体   English   中英

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

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

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

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

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

查看 C# 中的 Visio Interop 程序集,我可以看到名为“OnDocumentOpened”和“OnDocumentCreated”的 Visio.Application 事件,但它们直到文件加载“之后”才会触发。 不幸的是,我找不到任何名为“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

我不会做得太过分。 您可以升级您的用户。 比如,提供一个脚本(或安装程序中的某种功能,或应用程序中的某个按钮)来更新图表。 即一个单独的功能,只是不要在打开图表时这样做。 由于是一次性操作,用户可能不会为此哭泣。 而且您不会向应用程序添加“垃圾”一次性代码......

需要明确的是:您要查找的“文档打开前”事件不存在。

关于 Visio 中 VBA 宏的另一个提示:将代码放在模板中。 当您在图纸中有代码时,它会在创建的每个图纸中激增。 如果您需要更改代码,那么您必须找到所有图纸并更改所有代码。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM