如何在VBA中正确使用全局对象?

How to use global object in VBA correctly?

提问人:S.Parseh 提问时间:8/27/2023 最后编辑:StayOnTargetS.Parseh 更新时间:8/28/2023 访问量:66

问:

我有一个用 c# 编写的 COM DLL,用于 MS Word(使用 Interop)并将此 COM 用于 VB6 项目。

在一个模块中,我定义了一个全局变量,如下所示:

Public obj As Office.OfficeWord

在 Form1 中:

Set obj = New OfficeWord

通过创建对象,将创建一个 word 实例,我可以在任务管理器中看到该实例。 在 Form2 中,我创建一个新文档并关闭它(不是 Word.Application):

OfficeWord.CreateNewDoc
// doing some work   
OfficeWord.Close

当我关闭 Form2 并尝试再次添加新文档(在 Form1 或 Form2 中)时,出现以下错误: “Word 遇到了问题”。但是,该实例处于活动状态,我可以在任务管理器中看到它。 我应该提一下,如果我只是使用 Form1,一切都很好,我可以添加一个新文档并多次关闭它,最后,也关闭实例(obj。退出),但是当我想在 Form2 中使用公共对象时,我收到上面的错误。

C# DLL 使用以下代码行来创建和关闭 Word 文档和实例:

 public OfficeWord() 
 {
    wdapp = new Word.Application();
 }

public int CreateNewDoc()
{
   wddoc=wdapp.Documents.Add();
}

public int Close()
{
   object saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;
   object originalFormat = Word.WdOriginalFormat.wdOriginalDocumentFormat;
   object routeDocument = false;
   wddoc.Close(ref saveOption, ref originalFormat, ref routeDocument);
}

public int Quit()
{
    wdapp.Quit(false);   
}

使用 Form1、Form2 和公共变量是必需的。 请指导我。 谢谢。

C# VBA MS-Word COM Office-互操作

评论

0赞 nbk 8/27/2023
您不仅可以尝试关闭它,还可以将其设置为无,但为什么不让 wddoc 成为本地并将其作为参数提供给其他函数呢?
0赞 S.Parseh 8/27/2023
谢谢@nbk。我将其设置为无,但结果相同。我尝试使用wdapp。ActiveDocument 而不是 wddoc 也是如此,但它没有区别。
0赞 jdweng 8/27/2023
对象有两种类型:1)早期绑定 2)后期绑定。早期绑定是在后期绑定时编译的对象,类型是在运行时确定的。C# 在运行时测试对象类型时进行管理,在无法识别类型时发生异常。VB6 的测试不如 c#。此外,c# 还添加了程序在定义的内存空间之外访问内存(不安全)时的例外情况。您可以尝试将代码作为不安全的方式运行。请参见 : learn.microsoft.com/en-us/dotnet/csharp/language-reference/...
0赞 StayOnTarget 8/28/2023
我想你的意思是 VBA,而不是 VB6。
0赞 jdweng 8/28/2023
@StayOnTarget : VBA 是 Office 产品中的基本Microsoft。VB6 是 Microsoft Visual Basic 2006。

答:

0赞 BQF 8/27/2023 #1

这可能看起来有点奇怪,但它在“vb6”中工作了很多次。 使用相应对象且不再需要它后,将其设置为“无”。

在 Form1 中:

Set obj = Nothing
Set obj = New OfficeWord

评论

0赞 S.Parseh 8/28/2023
谢谢@BQF。你是对的,这是因为 vb6。
0赞 BQF 8/28/2023
VB6 编译器有“美丽心灵”。(@S.帕塞)