详情
症状
当我尝试在插件Normal.dotm
事件期间将VBA模块注入用户的Startup
模板时,即使选中该选项,也会出现VBA project is not trusted
错误。当我尝试从模板中获取VBProject对象时会发生这种情况:
Private Sub ThisAddIn_Startup() Handles Me.Startup
Dim template as Word.Template = GetNormalTemplate()
If template IsNot nothing Then
Dim vbProj = template.VBProject 'Error thrown here
End If
End Sub
仅在勾选General
选项Show the start screen when this application starts
时才会发生这种情况。
出于某种原因,即使在 splash 屏幕期间加载了普通模板,在实际显示文档之前, start 屏幕上的VBProject也不可用(空白或其他)。
结果
我设法通过在WindowActivate
事件第一次触发时运行代码而不是在加载项的Startup
事件期间运行代码来获得我的目标:
Property hasInjectedVba As Boolean = False
Private Sub WindowHasActivated() Handles Application.WindowActivate
If Not hasInjectedVba Then
Try
injectVba()
hasInjectedVba = True
Catch ex As Exception
'handle the something that went wrong
End Try
End If
End Sub
摘要
如果您正在尝试安全,那么Cindy会提出一些非常好的观点,如果您使用插件模板,那么最重要的是The security measure not allowing programmatic access to VB projects can remain in-place
- 这样可以完全避免这个问题。
答案 0 :(得分:0)
您应该考虑明确创建一个模板(* .dotm),以便与您的加载项进行交互,而不是将代码注入到用户的Normal.dotm中。
除了COM加载项(VSTO利用的技术)之外,Word还支持"模板加载项"。这些可以安装在Word Start-up文件夹中,以便Word始终自动加载它们,或者您可以选择明确加载(和卸载)加载项。
在Word对象模型中,这是Addins
集合。它镜像对话框"模板和加载项"在Word UI中。
除了一些" Auto"宏,任何代码(和RibbonXML扩展)在"加载项模板"行为与Normal.dotm中的代码相同。
使用加载项模板而不是Normal.dotm的优点: