【发布时间】:2019-11-18 00:39:50
【问题描述】:
我们的产品使用 VSTO (C#) 从模板创建新文档:
Document document =_application.Documents.Add(filePath);
“文档”变量将包含对文档对象的引用。 现在我们有一个客户,他在 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 集合包含一个额外的文档,但 'document' 变量为空。
我正在寻找一个适当的解决方案来获取对新创建文档的引用。
我可以在添加新文档之前获取当前打开的文档列表,然后获取列表,比较它们并找到新文档。但是如果 VBA 代码在不关闭它的情况下创建了一个新文档,则会有 2 个新文档。我仍然不知道我从 C# 代码创建的文档是什么。
那么有没有办法确定在这种情况下我从 C# 代码创建的文档是什么?
【问题讨论】:
-
VSTO 和 VBA 中的文档集合是完全独立的,据我所知,它们之间无法交换数据(使它们“等效”)。我建议 C# 代码将文档保存到一个临时(读取:晦涩但静态的文件名和路径)文件,然后 VBA 代码可以在创建该文档后访问和打开该文档。
-
我知道设置有点奇怪。但是 VBA 代码是我们无法控制的。客户有一些他们需要的场景。但令我惊讶的是,C# 代码突然没有返回文档,而是返回一个空值。
-
客户的 VBA 对我来说没有任何意义。当我读到它时,它告诉我,当生成一个新文档时,这个宏正在创建 another 新文档 - 没有指定特定的模板。我还想查看该代码的其余部分,以了解这些文档中的第一个(
Doc参数)会发生什么。我敢打赌它会在那里的某个地方关闭...无论如何,这会导致“丢失”您的加载项创建的文档... -
(顺便说一下,cmets 是不正确的:标准模块是顶部;类是底部。我假设类名是
ThisApplication?) -
@CindyMeister,谢谢我编辑了 cmets。 VBA 对我来说也没有意义;-) 这段代码是我们所知道的,并且能够重现该场景。我认为 m40_tim 的解决方案可以帮助我。谢谢