我只想要一个所有 ActiveSheet 属性的列表
您无法使用 100% VBA 代码轻松地以编程方式获得它,VBA 几乎具有零反射功能。
现在,假设我们不是在寻找检索对象属性的编程方式,以下是如何使用对象浏览器来获取您要查找的内容。
首先,右键单击对象浏览器中的任意位置并选择“显示隐藏的成员”选项以显示您正在查看的库的全部范围。这会在编辑代码时影响名称列表下拉列表:您现在将看到隐藏的成员。
Excel 类型库中的隐藏模块之一是一个名为 的模块Global
,具有隐藏的_Global
界面:

该隐藏的全局模块是您可以键入的方式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
现在,当我们键入 时Sheet.
,我们是早期绑定的(所涉及的类型在编译时是已知的和解析的)并且提供了所有可用成员的列表,这很有帮助:

每次访问返回 anObject
或 a的成员(函数、属性)时,对其进行的Variant
任何成员调用都将是后期绑定的。
努力停留在早期绑定领域:根据需要声明局部变量,以便编译器能够“看到”并验证所有内容!尝试输入下面的代码来感受不同 - 每当您输入一个.
点但没有出现任何内容时,这表明编译器正在忽略正在发生的事情,您可能会将编译时错误转移到运行时:
MsgBox ActiveSheet.DisplayRightToLeft '<~ late bound
Dim Sheet As Worksheet
Set Sheet = ActiveSheet
MsgBox Sheet.DisplayRightToLeft '<~ early bound