vba - application.Documents.Add(filePath) 在 VBA 代码干扰时返回 null
问题描述
我们的产品使用 VSTO (C#) 从模板创建新文档:
Document document =_application.Documents.Add(filePath);
'document' 变量将包含对文档对象的引用。现在我们有一个客户,它在 Word 启动文件夹中安装了一个模板,其中包含创建文档的 VBA 代码,使用该文档并将其删除。
'' Module contents
Dim oAppClass As New ThisApplication
Public Sub AutoExec()
Set oAppClass.oApp = Word.Application
End Sub
'' Class module contents
Public WithEvents oApp As Word.Application
Private Sub oApp_NewDocument(ByVal Doc As Document)
Dim oDoc As Document
Set oDoc = Documents.Add
' do something with the document
oDoc.Close
End Sub
当这个 vba 代码到位时,C# 代码(在问题的顶部)返回 null 而不是刚刚创建的文档。所以文档实际上是在 Word 中创建的,并且 application.Documents 集合包含一个额外的文档,但“文档”变量为空。
我正在寻找一个正确的解决方案来获取对新创建文档的引用。
我可以在添加新文档之前获取当前打开的文档列表,然后获取列表,比较它们并找到新文档。但是如果 VBA 代码在不关闭它的情况下创建了一个新文档,则会有 2 个新文档。比我仍然不知道我从 C# 代码创建的文档是什么。
那么有没有办法确定在这种情况下我从 C# 代码创建了什么文档?
解决方案
“有没有办法确定在这种情况下我从 C# 代码创建了什么文档?”
是的。查询文档的AttachedTemplate
属性。如果启动模板中的 VBA 代码与您的问题中显示的一样,则它创建的任何文档都.AttachedTemplate.Name
将返回Normal.dotm
,而您的文档将附加到您传入的模板中filePath
。
通过比较你应该得到一个匹配.AttachedTemplate.FullName
。filePath
推荐阅读
- angular - 在订阅回调函数中取消订阅?
- sql - 在第二个到最后一个字符出现之后选择字符串
- c# - 如何找出 TextBox Leave 事件的私有字段值?
- android - React Native WebView onMessage 在最新的 Chome Android 版本中停止工作
- javascript - 在 XD 插件中存储额外数据
- python - 尽管正在添加字典键,但它们不存在
- c# - C# 当我执行查询时 dataTable 未加载并且我获得了过期异常
- unity3d - 设置自定义事件后,谷歌分析的 Unity 插件需要多长时间才能生成报告?Unity Analytics 需要 8-10 小时
- rx-java2 - RxJava2 CompositeDisposable 可以自行清除已处置的订阅吗?
- ruby-on-rails - 使用 Phusion Passenger 和 Nginx 更新 Rails 应用程序