【问题标题】:Why does every class in VBA have an Application property?为什么 VBA 中的每个类都有一个 Application 属性?
【发布时间】:2014-06-09 23:13:16
【问题描述】:

我想澄清一下为什么 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 属性(notApplication class 混淆)记录不充分,这就是为什么我要求有更多经验的人为我澄清这一点。

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

【问题讨论】:

  • 可能是因为如果您将 Workbook 对象传递给 COM 服务器,该服务器将获得对主机 Excel 实例的访问权限。 OLE 在 OLE 主机中嵌入工作表也是如此。

标签: excel class vba automation ole


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答@Dick Kusleika。是的,我想 Spolsky 最清楚,但你肯定给了我一些关于 Application 属性的线索。干得好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2016-02-02
  • 2020-09-09
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多