gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:33:35 26 4
gpt4 key购买 nike

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

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

Sheets("Sheet1").ChartObjects(1).Chart.ChartArea.Border.LineStyle = xlContinuous


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


我找到ChartArea的条目是Library是Excel,Class是Chart且Member为空-成员为空是否告诉我一些东西,这是我应该寻找的东西吗?
无论如何,我继续输入“ border”。我本来希望在“类”中找到与图表有关的内容。但是我没有。那么,我应该如何知道如何找到想要的东西?
在讨论的同时,让我询问有关Microsoft的帮助。我用谷歌搜索了 Border.LineStyle property。显然,有一个代码示例告诉我有关如何将其与Charts()。ChartArea一起使用的方法,但是我又可以更系统地进行此操作吗?在左侧,您可以看到LineStyle是Border的属性。从那里,我如何上移一个级别?我如何看到Border是/可以是ChartArea的财产?

最佳答案

TL; DR:

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

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



图书馆过滤器和搜索框

顶部看起来像这样:



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


Excel:Excel类型库,定义诸如WorksheetRange等的内容。
Office:Excel类型库的依赖项;定义CommandBars之类的东西。
stdole:另一个依赖项;定义了诸如StdFontStdPicture之类的较低层次的东西。
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


Rubberduck注释也可以 control/synchronize other hidden attributes对象浏览器未公开,但我离题了。



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

采用以下表达式:

Sheets("Sheet1").ChartObjects(1).Chart.ChartArea.Border.LineStyle = xlContinuous


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


Application.Sheets
Workbook.Sheets


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



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

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

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


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


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

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

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

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


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



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

Dim targetChartObj As ChartObject
Set targetChartObj = sheet.ChartObjects(1)
targetChartObj.Chart.ChartArea.Border.LineStyle = xlContinuous


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



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

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



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

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

关于excel - VBA:如何使用对象浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56119109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com