Excel 中 Application.ActiveSheet 的所有属性 - 对象浏览器未列出成员的属性

All properties of Application.ActiveSheet in Excel - Object Browser does not list the properties of Members

Microsoft 文档没有列出 Object Application.ActiveSheet 的所有属性: https://docs.microsoft.com/en-us/office/vba/api/excel.application.activesheet

它只包含了一些属性,例如:ActiveSheet.Name。但是从我在互联网上找到的 VBA 脚本中,我知道还有更多属性,例如: ActiveSheet.Type

所以我想也许我可以用这个 VBA 代码列出它们:来自:VBA collection: list of keys

Sub AktivSheet()
Dim key As Variant
For Each key In Application.ActiveSheet
    Debug.Print "Key: " & key, "Value: " & Application.ActiveSheet.Item(key)
Next
End Sub

但是没有用,Microsoft Docs 建议使用对象浏览器。但是对象浏览器没有列出 Application.ActiveSheet:

的属性

我没主意了!我只想要所有 ActiveSheet 属性的列表。因为我只需要知道活动 Sheet 的文本方向,就像它是从左到右或从右到左。

I just want a list of all ActiveSheet properties

您无法使用 100% VBA 代码轻松地以编程方式获得它,VBA 的 反射 功能几乎为零。

现在,假设我们不是寻找一种编程方式来检索对象属性,下面是如何使用对象浏览器来获取您要查找的内容。

首先,right-click 对象浏览器中的任意位置和 select“显示隐藏成员”选项以显示您正在查看的库的全部范围。这会影响编辑代码时的姓名列表下拉列表:现在您将看到隐藏的成员。

Excel 类型库中的一个隐藏模块,是一个名为 Global 的模块,具有隐藏的 _Global 接口:

那个隐藏的全局模块是你输入 MsgBox ActiveSheet.Name 的方式,它“正常工作”(假设 ActiveSheet - 它总是会崩溃当您正在使用的 Application 实例中没有打开活动工作簿时出现错误 91),即使您没有指定 Workbook 您正在使用的内容:隐含地,ActiveSheet正在处理 ActiveWorkbook 是什么。

所以ActiveSheet是一个属性,不是一个对象。 returns是一个属性对象,但是它声明的类型是Object.

这意味着您直接针对 ActiveSheet 进行的任何成员调用都是隐含的 late-bound:您可以键入 MsgBox ActiveSheet.Naem 并且 VBA 将愉快地编译拼写错误(Option Explicit 不能在这里救你),并且只会在 run-time 处爆炸并出现错误 438“我找不到那个 属性!”。

为了知道 ActiveSheet 有什么属性,我们需要知道我们正在查看的 run-time 类型。由于 Workbook 对象中的 sheet 可以是 WorksheetChart 或其他几种遗留“sheet”对象,因此确实存在在 compile-time 没有成员可访问,因为在 compile-time ActiveSheet 只是一个指向 Object 的指针,只有在 [=88] 才知道是什么类型的对象=].

因此,我们没有针对 ActiveSheet 进行编码,而是针对 Worksheet 进行编码,因为我们知道我们期望使用的特定 sheet 是一个 Worksheet 对象.

Dim Sheet As Worksheet
Set Sheet = ActiveSheet

现在,当我们键入 Sheet. 时,我们是 early-bound(所涉及的类型是已知的并在 compile-time 处解析)并提供了所有可用成员的列表:

每次访问 returns 一个 ObjectVariant 的成员(函数,属性)时,针对它的任何成员调用都将是 late-bound.

努力保持在 early-bound 境界:根据需要声明局部变量,以便编译器能够“看到”并验证所有内容!尝试 键入 下面的代码以 感受 差异 - 每当您键入 . 点但什么也没有出现时,这就是编译器的标志看不到正在发生的事情,您可能将 compile-time 错误移至 run-time:

MsgBox ActiveSheet.DisplayRightToLeft '<~ late bound
Dim Sheet As Worksheet
Set Sheet = ActiveSheet
MsgBox Sheet.DisplayRightToLeft '<~ early bound