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

Sha*_*yan 1 excel vba object objectbrowser

Microsoft Docs 未列出 Object 的所有属性Application.ActiveSheethttps : //docs.microsoft.com/en-us/office/vba/api/excel.application.activesheet

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

所以我想也许我可以用这个 VBA 代码列出它们:来自:VBA 集合:键列表

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

但它不起作用,Microsoft Docs 建议使用对象浏览器。但是对象浏览器没有列出 Application.ActiveSheet 的属性:

ActiveSheet 对象浏览器

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

Mat*_*don 10

我只想要所有 ActiveSheet 属性的列表

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

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

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

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

Excel的全局模块

隐藏的全局模块是你可以键入MsgBox ActiveSheet.Name它“只是工程”(假设一个ActiveSheet-它总是可以炸掉与错误91时,有在没有活动的工作簿打开Application比如你正在使用的),即使你有没有指定Workbook您正在使用的内容:隐含地,ActiveSheet只是在处理任何ActiveWorkbook内容。

属性ActiveSheet也是如此,而不是对象。它是一个返回对象的属性,但其声明的类型是.Object

这意味着您直接针对 进行的任何成员调用ActiveSheet都是隐式后期绑定的:您可以输入MsgBox ActiveSheet.Naem,VBA 会很高兴地编译错字(Option Explicit这里不能保存您),并且只会在运行时出现错误 438“我可以”没有找到那个属性!”。

为了知道它有什么属性ActiveSheet,我们需要知道我们正在查看什么运行时类型。并且由于Workbook对象中的工作表可以是 a Worksheet、 aChart或其他几种类型的遗留“工作表”对象,因此在编译时确实没有可访问的成员,因为在编译时ActiveSheet只是指向 an 的指针Object,还有什么仅在运行时才知道的对象类型。

因此ActiveSheet,我们不是针对 进行编码,而是针对 进行编码Worksheet,因为我们知道我们期望使用的特定工作表是一个Worksheet对象。

Dim Sheet As Worksheet
Set Sheet = ActiveSheet
Run Code Online (Sandbox Code Playgroud)

现在,当我们输入 时Sheet.,我们是早期绑定的(所涉及的类型在编译时已知并解决),并提供了所有可用成员的列表:

成员下拉列表列出本地 Sheet 对象变量的所有成员

每次访问返回 anObject或 a的成员(函数、属性)时,对其进行的Variant任何成员调用都将是后期绑定的。

努力留在早期绑定的领域:根据需要声明局部变量,这样编译器就可以“看到”并验证所有内容!尝试键入以下代码以感受不同 - 每当您键入一个.点而什么也没有出现时,这表明编译器忽略了正在发生的事情,并且您可能将编译时错误移至运行时:

MsgBox ActiveSheet.DisplayRightToLeft '<~ late bound
Run Code Online (Sandbox Code Playgroud)
Dim Sheet As Worksheet
Set Sheet = ActiveSheet
MsgBox Sheet.DisplayRightToLeft '<~ early bound
Run Code Online (Sandbox Code Playgroud)