首页 > 解决方案 > 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# 代码创建了什么文档?

标签: vbams-wordvsto

解决方案


“有没有办法确定在这种情况下我从 C# 代码创建了什么文档?”

是的。查询文档的AttachedTemplate属性。如果启动模板中的 VBA 代码与您的问题中显示的一样,则它创建的任何文档都.AttachedTemplate.Name将返回Normal.dotm,而您的文档将附加到您传入的模板中filePath

通过比较你应该得到一个匹配.AttachedTemplate.FullNamefilePath


推荐阅读