【问题标题】:application.Documents.Add(filePath) returns null when VBA code interferingapplication.Documents.Add(filePath) 在 VBA 代码干扰时返回 null
【发布时间】: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 的解决方案可以帮助我。谢谢

标签: vba ms-word vsto


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多