在VBA监视窗口中查找特定文本

8
VBA 观察窗口允许您在逐行执行宏的过程中监视变量。有没有办法展开观察列表中包含的对象的所有属性,并通过搜索它们来查找特定文本?可以将观察列表中的单行复制到记事本或 Word 等应用程序中,但似乎没有办法导出整个观察列表的内容或一次性搜索所有行。
我正在尝试确定 Excel 电子表格上一个对象的具体属性。能够在观察列表中查找其中包含的文本将极大地加快我的搜索速度。

2
你看过对象浏览器吗?F2 - user2140173
根据@mehow的建议,使用对象浏览器。不确定监视列表是否允许这种编程访问方式,但即使允许,如果您不知道如何使用对象浏览器,尝试自动化VBE也是一项非常艰巨的任务。 - David Zemens
1
我可能在错误地使用对象浏览器,但我真的正在寻找上下文中的属性。我相信我最终可以通过搜索来识别我正在寻找的属性,但是类似于CSS(通过视觉定位项目),您可以操作对象以具有非常独特的特征,然后确定其位置。同样,我想将唯一的文本放入字段(例如),然后将该文本用作目标标识符以查找相关属性。 - Shrout1
我建议在SO上简单地将该属性作为问题提出——这甚至可能更快!:) 就我所知,由于VBA不支持类型内省,因此无法以有意义的方式搜索活动对象的属性。唯一的替代方法是通过对象浏览器搜索对象定义,正如其他人所建议的那样。 - Blackhawk
@Blackhawk,这并不完全正确。在我的下面的回答中,您可以看到,在VBA中,您可以使用TypeLib信息对象库对公共对象和成员进行有限类型内省,就像对象浏览器一样。您可以通过该库以编程方式访问对象浏览器使用的信息。 - AndASM
我很高兴地纠正了自己——TypeLib看起来像是一些强大的魔法!我必须补充说明,由于TypeName函数TypeOf运算符,我也是错误的,尽管它们不是OP问题的答案,但它们在技术上都是类型内省的形式。 - Blackhawk
1个回答

5
在VBA中(基本上是VB6),最接近的方法是使用TypeLib Information Object Library。这里有一些示例代码hereSelf Inspection of VB6 UDTs
您可以创建一个函数,扫描对象的成员以查找特定名称或值。在调试期间,可以从即时窗口调用此函数,并通过Debug.Print输出其结果。由于语言和环境的限制,您只能搜索公共对象、类型和接口的公共成员。
例如,为了满足自己的好奇心,我创建了一个简单的示例。它只进行浅层单级搜索,仅查看成员名称,而不是值。您可能需要阅读文档,以便查询成员的值(当它们是属性时),并可能查看返回对象、集合或接口的成员的某种递归。
要运行这段代码,您需要在VBA编辑器中添加对的引用。
Option Explicit

Sub FindMember(target As Object, searchString As String)
  Dim interface As TLI.InterfaceInfo
  Dim member As MemberInfo
  
  Set interface = TLI.InterfaceInfoFromObject(target)
  
  For Each member In interface.Members
    If InStr(1, member.Name, searchString, VbCompareMethod.vbTextCompare) > 0 Then
      Debug.Print "Found in " & interface.Name & " member " & member.Name
    End If
  Next
End Sub

Public Sub Test()
  Debug.Assert False
End Sub

然后我运行了Test子程序。当它在Debug.Assert False行上暂停时,我在即时窗口中运行了我的FindMember子程序,得到了下面的结果。(您不必调试活动代码即可使用此函数,它可以从普通代码或在没有运行任何内容时从即时窗口中使用。我只是为了确保它能够在暂停活动代码时使用)。

FindMember Application, "ang"
Found in _Application member Range
Found in _Application member MaxChange
Found in _Application member MaxChange
Found in _Application member UILanguage
Found in _Application member UILanguage
Found in _Application member LanguageSettings

理论上,TypeLib信息对象库应该能够查看对象浏览器所能查看的任何内容。有趣的一点是,尝试在您自己的项目中定义一个私有子程序。您会发现,对象浏览器无法查看它,但可以查看您在模块和(公共)类中定义的公共成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接