1

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

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

ActiveSheet 对象浏览器

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

4

1 回答 1

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

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

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

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

努力停留在早期绑定领域:根据需要声明局部变量,以便编译器能够“看到”并验证所有内容!尝试输入下面的代码来感受不同 - 每当您输入一个.点但没有出现任何内容时,这表明编译器正在忽略正在发生的事情,您可能会将编译时错误转移到运行时:

MsgBox ActiveSheet.DisplayRightToLeft '<~ late bound
Dim Sheet As Worksheet
Set Sheet = ActiveSheet
MsgBox Sheet.DisplayRightToLeft '<~ early bound
于 2020-09-22T14:44:43.997 回答