为什么VBA中的每个类都有一个Application属性?

时间:2014-04-24 15:06:16

标签: excel class vba automation ole

我想澄清为什么VBA中的每个类(或几乎每个类)(当您滚动对象浏览器时)都具有Application属性。

MSDN说

  

在没有对象限定符的情况下使用时,此属性返回一个   表示Microsoft Excel应用程序的应用程序对象。   与对象限定符一起使用时,此属性返回一个   表示指定对象的创建者的应用程序对象   (您可以将此属性与OLE自动化对象一起使用以返回   该对象的应用)。只读。

第一句很清楚。您在没有限定符的情况下使用的托管应用程序可以是支持VBA的MS Office产品之一。

在Excel中Debug.Print Application = Microsoft Excel
在Word Debug.Print Application = Microsoft Word
等...

但......第二句话对我来说完全不清楚......所以我在想,无论你从哪里调用.Application,它总会返回一个物体的主人......

  • 那么,VBA中每个类有Application属性的重点是什么?

PS。您随时可以致电.Parent => .Parent进入等级......不是吗?您只需致电Application没有限定符就可以获得...

我甚至无法想到一个SSCCE OLE场景,所以我很抱歉我没有提供一个例子。 Application属性(Application 混淆)的记录很少,这就是为什么我要求有更多经验的人澄清的原因这对我来说。

一个(井,某种)方案,但不确定它在这里是否适用可能是使用Interop for Office。比如,如果你有一个打开两个文件(一个Excel和一个Word)的外部应用程序,那么通过在两者中获得对Range的引用,你可以返回Microsoft Excel和{{1}但是这对任何人都有用吗?嗯......我不理解这整个概念?

1 个答案:

答案 0 :(得分:7)

这有两个层次。首先,每个类都有一个Application属性的原因是因为有人认为这是一个好主意,并且他们创建了一个基类,其他每个类都继承该类。有点像决定通过类一致地应用Value属性或Item属性。

真正的问题是为什么有人认为这是个好主意。我不知道,但这可能是Spolsky的想法,所以他应该回答。我可以告诉你我是如何使用它的。

如果我从Excel自动化Outlook,我通常会创建一个olApp变量来保存Outlook应用程序。但我没有。我可以通过它创建一个MailItem和引用Application。我在哪里使用Application属性是调试。我有一个MailItem对象实例化,我收到一个错误。例如,我可以看到收件箱中有多少项目,即使我在范围内没有应用程序对象变量。在即时窗口中:

?olMailItem.Application.GetDefaultFolder(1).Items.Count

我可以将一堆.Parent调用串起来,但我不一定知道我需要多少。这是MSDN描述的第二部分发挥作用的地方。如果我使用不带限定符的应用程序(我在Excel中),则默认为Excel.Application。但是olMailItem的Application属性返回Outlook.Application,因为它位于包含MailItem类的对象层次结构的顶部。

我认为这只是一个方便的捷径,有人认为它非常方便,他们将它编码到所有对象的基类中。