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

Excel 为什么VBA中的每个类都有一个应用程序属性?,excel,class,vba,automation,ole,Excel,Class,Vba,Automation,Ole,我想澄清一下为什么VBA中的每个类(或几乎每个类)(当您滚动浏览对象浏览器时)都有一个应用程序属性 MSDN说 如果在没有对象限定符的情况下使用,此属性将返回 表示Microsoft Excel应用程序的应用程序对象。 当与对象限定符一起使用时,此属性返回 表示指定对象的创建者的应用程序对象 (您可以将此属性与OLE Automation对象一起使用,以返回 该对象的应用)。只读 第一句话很清楚。您在没有限定符的情况下使用的托管应用程序可以是支持VBA的MS Office产品之一 在ExcelD

我想澄清一下为什么VBA中的每个类(或几乎每个类)(当您滚动浏览对象浏览器时)都有一个
应用程序
属性

MSDN说

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

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

在Excel
Debug.Print应用程序中
=
Microsoft Excel

在Word
Debug.Print应用程序中
=
Microsoft Word

等等。。。

但是…第二句对我来说完全不清楚。。。所以我想无论你从哪里调用
。应用程序
都会返回一个对象的主机

  • 那么,VBA中的每个类都有
    应用程序
    属性有什么意义呢?
另外,您可以随时调用
.Parent
=>
.Parent
来升级层次结构。。。你不能吗?您只需调用
应用程序
,而无需使用限定符即可获得该应用程序

我甚至想不出一个SSCCE OLE场景,所以很抱歉,我没有提供一个示例。
应用程序
属性(
应用程序
混淆)的文档记录不完整,这就是为什么我要求有更多经验的人为我澄清这一点


一个(嗯,有点)场景,但不确定它是否适用于这里,可能是使用Interop for Office。例如,当您有一个打开两个文件(一个Excel和一个Word)的外部应用程序时,通过在这两个文件中获取对
范围的引用,您可以返回
Microsoft Excel
Microsoft Word
。。但这对任何人都有用吗?嗯……我不是完全理解这个概念吗?

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

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

如果要从Excel自动化Outlook,通常会创建一个olApp变量来保存Outlook应用程序。但我不必。我可以通过它创建一个MailItem和参考应用程序。我使用应用程序属性的地方是调试。我实例化了一个MailItem对象,但出现了一个错误。例如,我可以看到收件箱中有多少项,即使我的作用域中没有应用程序对象变量。在即时窗口中:

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


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

可能是因为如果您将一个
工作簿
对象传递给COM服务器,该服务器将获得对主机Excel实例的访问权。OLE在OLE主机中嵌入工作表也是如此。感谢您的回答@Dick Kusleika。是的,我想斯波尔斯基最清楚,但你肯定给了我一些关于
应用程序
属性的线索。做得好