VBA:如何使用对象浏览器?

NoN*_*123 9 excel vba

我不知道这是否是我提出问题的正确地方,但是:如何使用对象和浏览器?在帮助自己方面,我感到无能为力。我知道我可以Google的东西(而且很多),但是我希望能够使用手头的所有资源。

让我们以图表为边界。Google再次帮助我,并告诉我可以这样更改它:

Sheets("Sheet1").ChartObjects(1).Chart.ChartArea.Border.LineStyle = xlContinuous
Run Code Online (Sandbox Code Playgroud)

但是,如何使用对象浏览器解决这个问题?假设我输入“图表”。我得到了很长的清单,经过这个过程之后,可能不是我想出来的,因为我必须知道自己在寻找什么ChartArea。仍然有一个问题:

  1. 我找到了ChartArea,该条目的库为Excel,类为Chart,成员为空-成员为空是否告诉我一些东西,这是我应该寻找的东西吗?

  2. 无论如何,我继续输入“ border”。我本来希望在“类”中找到与图表有关的内容。但是我没有。那么我应该怎么知道如何找到我要的东西呢?

  3. 在讨论的同时,让我询问有关Microsoft的帮助。我用谷歌搜索Border.LineStyle属性。显然,有一个代码示例告诉我有关如何将其与Charts()。ChartArea一起使用的方法,但是我又可以更系统地进行此操作吗?在左侧,您可以看到LineStyle是Border的属性。从那里,我如何上移一个级别?我如何看到Border是/可以是ChartArea的财产?

Mat*_*don 13

TL; DR:

ChartArea.Border属性是隐藏的,您需要在“对象浏览器”中切换“显示隐藏的成员”才能看到它。

以下是本质上有关对象浏览器的所有信息。


图书馆过滤器和搜索框

顶部看起来像这样:

库下拉列表,搜索框

该下拉列表包含所有引用的类型库,由它们的程序名称标识:

  • Excel:Excel类型库,定义了一些事情,如WorksheetRange
  • Office:Excel类型库的依赖项;定义类似的东西CommandBars
  • stdole:另一个依赖;定义了诸如StdFont和的较低层次的内容StdPicture
  • VBA:VBA的标准库,定义了一些事情,如MsgBoxCollection
  • VBAProject:已编译的VBA项目的类型库。

您将需要使用该下拉列表将查看的内容限制为要浏览的特定类型库,例如Excel。在下拉菜单下,有一个搜索框,您可以用来搜索出现在标识符一部分中的字符串并填充“搜索结果”视图-但您已经知道了。

显示隐藏的成员

右键单击工具栏中的空白区域;选择“显示隐藏的成员”-现在,对象浏览器和InteliSense将列出否则隐藏的成员,您将很快发现Excel类型库比看起来大得多。

对象浏览器上下文菜单,其中“显示隐藏的成员”已切换

编辑模块/成员说明

导航到您的VBAProject库,然后在左窗格中找到一个模块;右窗格将列出该模块的成员。右键单击该模块或其成员之一,然后选择“属性”-弹出“成员选项”对话框,让您输入描述:

成员选项对话框

存在的模块和成员说明会显示在底部窗格中:

底部窗格中显示的模块说明

如果导出该模块,您将看到它现在具有一个隐藏VB_Description属性,该属性的字符串值与您为描述输入的内容匹配。

如果您使用的是Rubberduck,则也可以使用特殊注释(“注释”)来控制这些隐藏的属性:

'@ModuleDescription("This module contains some boring recorded macros.")
Option Explicit

'@Description("Does something...")
Public Sub Macro1()
    '...
End Sub
Run Code Online (Sandbox Code Playgroud)

Rubberduck注释也可以控制/同步其他隐藏属性对象浏览器没有暴露,但我离题。


左窗格(“类”)显示所选库中的所有类型;右窗格列出了按类型(属性,方法,事件等)分组的所选类型的成员;您必须牢记的是,无论有多少个成员的名称与类型/类/接口的名称相同,一个成员就是一个成员,而不是一个类型。

采用以下表达式:

Sheets("Sheet1").ChartObjects(1).Chart.ChartArea.Border.LineStyle = xlContinuous
Run Code Online (Sandbox Code Playgroud)

我们可以从查找Sheets成员调用所属的对象类型开始。如果我们对Excel库进行过滤并搜索Sheets,则会发现2个有趣的结果,其中一个成员名为Sheets

  • Application.Sheets
  • Workbook.Sheets

这意味着,除非该行代码位于的代码后面,否则ThisWorkbook我们所调用的内容将无法实现Workbook.Sheets-但我们都无法使用它来限定它Application!如果我们揭示隐藏的成员,我们会发现一个隐藏的Global类和一个_Global接口,它们都暴露一个Sheets成员!从那里我们可以推断出Excel对象模型正在“重定向”我们SheetsApplication对象的不合格调用,这看起来像是在给我们Sheets提供什么成员ActiveWorkbook。在任何情况下,之间的关系_GlobalGlobal令人困惑:我们选择_Global.Sheets和底部面板告诉我们,我们正在寻找的一员Excel.Global

_Global.Sheets

请注意,该属性没有任何参数:它只是产生对一个Sheets对象的引用。所以,我们看一下返回Sheets类型-通过单击底部面板中的超链接,或通过浏览左侧面板中找到Sheets集合类型(方便恰好具有相同的名称作为Sheets的财产GlobalApplicationWorkbook类)。

请注意,该Workbook.Worksheets属性还会产生一个Sheets收集对象。

与所有其他集合类一样,Sheets该类具有默认成员,并且该成员是隐藏的,名为_Default,并且返回Object。我们可以猜测该属性正在将调用转发给Item索引器,因为集合类通常提供一种通过索引或名称/键(按惯例命名的方式访问其项的方式,Item但有时还可以使用其他方式,例如Recordset.Fields)……但是该属性还返回Object

默认成员
VBA中的类可以具有一个成员(只有一个!),当将对象强制转换为值时,可以隐式调用该成员。该成员具有一个VB_UserMemId值为的隐藏属性,0对象浏览器在该成员的图标上用蓝色/青色点标识该属性。这就是Application.Name您写作时获取输出的方式Debug.Print Application;这也就是Range.Value在不使用关键字的情况下将对象Let强制Range转换为一个Variant或任何其他非对象类型的方式Set...这就是为什么Set在分配对象引用时需要使用关键字:没有它,编译器将无法告诉您是要分配对象本身还是其默认成员值...这很可能是另一个对象引用。
通常,最好避免隐式的默认成员调用并进行显式的调用,以使代码说明其作用,并执行其作用

在这一点上,我们很困惑,就像编译器一样:该行代码上的每个其他成员调用只能在运行时解决-它们都是后期绑定的,当您键入它时,您将看不到IntelliSense,没有自动完成,没有编译时验证:甚至Option Explicit无法将您从错别字中解救出来,而且如果您输入错字,您就会知道,因为VBA会向您抛出错误438“我找不到该成员”。

Sheets._Default返回一个Object:并非所有工作表都是Worksheet对象-一个Chart也可以是工作表!这就是为什么我们通常更喜欢使用该Workbook.Worksheets属性,以便我们确定要获取一个Worksheet对象。对?“ Sheet1”是Worksheet,我们知道的太多!

我们可以通过声明一个Worksheet变量来恢复早期绑定:

Dim sheet As Worksheet
Set sheet = ActiveWorkbook.Worksheets("Sheet1")
sheet.ChartObjects(1).Chart.ChartArea.Border.LineStyle = xlContinuous
Run Code Online (Sandbox Code Playgroud)

因此,我们浏览到Worksheet左窗格中的类型,找到其ChartObjects方法(是Function),该方法还返回Object。在属性类型是Excel类型库中的通用约定之后,看起来就像在命名属性一样- ChartObjects左窗格中有一个对象集合,我们可以假定其项是ChartObject对象;因此,我们ChartObject在左窗格中再次找到该类,并看到它具有Chart返回Chart对象的属性:

Excel.ChartObject类成员

在这一点上,我们可以通过提取另一个变量来恢复早期的绑定,以进一步降低成员调用的链:

Dim targetChartObj As ChartObject
Set targetChartObj = sheet.ChartObjects(1)
targetChartObj.Chart.ChartArea.Border.LineStyle = xlContinuous
Run Code Online (Sandbox Code Playgroud)

ChartArea属性产生一个ChartArea对象,因此我们ChartArea在左侧面板中找到该类,并看到它具有隐藏的 Border属性!

Excel.ChartArea.Border隐藏了!

ChartArea.Border属性返回一个Border对象,再次在左侧面板中找到该对象,它具有LineStyle类型为...的属性Variant。那我们怎么知道xlContinuous呢?没有希望了吗?

在这一点上,我们可以谷歌搜索Border.LineStyle,看看文档是否为我们提供了有关法律价值的线索,或者我们可以尝试LineStyle在搜索框中进行搜索...

搜索LineStyle会出现XlLineStyle枚举

...然后看到有XlLineStyle一个名为的成员的枚举xlContinuous,以及在该枚举下定义的所有其他常量。快速的在线搜索显示了官方文档,并确认Border.LineStyle需要XlLineStyle枚举值!

现在,它从左到右移动。从右到左,您可以利用搜索框向上移动;搜索带有可见隐藏成员的“边框”,ChartArea.Border在搜索结果中列出该成员。