【发布时间】:2020-07-01 02:34:45
【问题描述】:
我有一个 Viso 2013 .vstm 文件,它在创建文档时启动 VBA 宏(用户手动打开模板时的模板实例化)。此宏从数据源填充创建的图形。完成后,我想以编程方式(从 VBA)保存已生成为 .vsdx 文件的图形,即所有用于填充图形的 VBA 宏都被删除。
我的问题是:
是否可以以编程方式从
.vstm文件本身中的 VBA 宏 (Visio 2013) 中删除 all 宏而不导致 VBA 宏失败,如果是,如何我可以吗?如果 1. 不可能,我如何以编程方式强制 Visio 将具有宏的绘图保存到
.vsdx(即保存忽略所有宏)如果 2. 不可能,我如何将当前图形(除宏之外的所有内容)复制到新图形,然后应该可以将其保存到
.vsdx?
我尝试了以下方法:
使用
VBProject.VBComponents.Item(index).CodeModule.DeleteLines删除所有行会导致宏失败,并显示“End Function is missing”(我已经检查过,没有任何地方缺少End Function,我的猜测是该宏可能会删除尚未执行的代码,从而导致此错误)Save和SaveEX也不起作用,我收到“VBProjects 无法保存在无宏文件中”错误/消息,即使我添加了 @987654333 @ 之前调用Save/SaveEx。
下面是一个示例代码。
Private Sub RemoveVBACode()
' If document is a drawing remove all VBA code
' Works fine however execution fails as all code has been deleted (issue 1)
If ActiveDocument.Type = visTypeDrawing Then
Dim i As Integer
With ActiveDocument.VBProject
For i = .VBComponents.Count To 1 Step -1
.VBComponents.Item(i).CodeModule.DeleteLines 1, .VBComponents.Item(i).CodeModule.CountOfLines
Next i
End With
On Error GoTo 0
End If
End Sub
Private Sub SaveAsVSDX(strDataFilePath As String)
RemoveVBACode
Application.AlertResponse = IDOK
' Next line fails at runtime (issue 2), the same occurs when using Save
ThisDocument.SaveAsEx strDataFilePath, visSaveAsWS + visSaveAsListInMRU
Application.AlertResponse = 0
End Sub
开始执行宏的代码是以下事件:
' This procedure runs when a Visio document is
' created. I.e., when the template (.vstm) is opened.
Private Sub Document_DocumentCreated(ByVal Doc As IVDocument)
' ...
SaveAsVSDX (strDataFilePath)
' ...
End Sub
【问题讨论】:
-
您的评论完全没有用,因为这不起作用。事实上,我有足够的声誉知道何时提问。你可以随心所欲地google它,MSDN中缺少Visio中
VBProject属性的API:msdn.microsoft.com/en-us/library/office/ff765161.aspx(更清楚的是MSDN没有解释如何使用这个属性来删除宏) -
一个很好的问题会表明您到目前为止已经尝试过什么,以及您在尝试中遇到了哪些具体的失败/错误/问题。所以,我的评论并不是“完全没用”,因为它促使你改进你的问题。不客气。
-
至于#3,最后一条评论here 建议将代码放在模板 中应该可以阻止代码扩散。这是最近的评论(不到 1 个月大)。如果您还没有尝试过,那也值得一试。
-
我没有 Visio,但这里有一些如何在 VBA 中删除模块的好主意。它应该可以工作 - cpearson.com/excel/vbe.aspx 看看这个
Sub DeleteModule()并尝试遍历所有模块。 -
@Vityata 关于
VBProject属性,MSDN链接中指出了如何访问,但也表明它是只读的,所以它不能像我们在其他应用程序中那样使用。