为什么VBA中的每个类都有一个应用程序属性?

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

MSDN说

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

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

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

但是……第二句话对我来说是完全不清楚的……所以我在想,不pipe你在哪里打电话。从它的应用程序总是会返回一个对象的主机…

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

PS。 你可以随时调用.Parent => .Parent来升级…不是吗? 你可以调用Application机智没有限定符得到…

我什至不能想到一个SSCCE OLE情况,所以我很抱歉,我没有提供一个例子。 Application属性(不要与Application 混淆)logging不完整,这就是为什么我要求有更多经验的人为我澄清这一点。

其中一种( 很好,有点 )的情况,但不确定它甚至适用于这里可以使用Interop for Office。 就像当你有一个打开两个文件(一个Excel和一个Word)的外部应用程序,那么通过在这两个文件中获得对Range的引用,你也许能够返回Microsoft ExcelMicrosoft Word ..但是这对于任何人? 嗯..我不理解这个整个概念?

这有两个层次。 首先,每个类有一个应用程序属性的原因是因为有人认为这是一个好主意,他们做了一个基类,从其他类inheritance。 有点像通过类一致地应用Value属性或Item属性的决定。

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

如果我从Excel自动化Outlook,我通常会创build一个olAppvariables来保存Outlook应用程序。 但是我不需要。 我可以通过它创build一个MailItem和参考应用程序。 我在哪里使用应用程序属性是debugging。 我有一个MailItem对象实例化,我得到一个错误。 例如,我可以看到收件箱中有多less项目,即使我没有在范围内的应用程序对象variables。 在直接窗口中:

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

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

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