以编程方式列出Excel VBA用户窗体事件过程

以编程方式列出Excel VBA用户窗体事件过程,excel,vba,Excel,Vba,首先,我已经了解了如何使用引用为TLBINF32.DLL的Typelib信息列出Excel用户表单控件的默认事件名称。 我分享了它。 创建代码流图和可能的VBA代码混淆器是我正在进行的项目的一部分。 现在的问题是,试图列出UserForm本身的事件过程: 与使用TLI-ClassInfoFromObject(UserForm1.CommandButton1)列出UserForm控件不同,我发现使用TLI-TypeLibInfoFromFile(“FM20.dll”)非常困难,因为如果我使用Cla

首先,我已经了解了如何使用引用为TLBINF32.DLL的Typelib信息列出Excel用户表单控件的默认事件名称。
我分享了它。
创建代码流图和可能的VBA代码混淆器是我正在进行的项目的一部分。

现在的问题是,试图列出UserForm本身的事件过程:
与使用TLI-
ClassInfoFromObject(UserForm1.CommandButton1)
列出UserForm控件不同,我发现使用TLI-
TypeLibInfoFromFile(“FM20.dll”)
非常困难,因为如果我使用
ClassInfoFromObject(UserForm1)
,就会出现错误。

我还发现我可以使用TLI-
ClassInfo对象(ThisWorkbook.VBProject.VBComponents(“UserForm1”).Designer)

使用FM20.dll和.Designer方法都可以获得16个事件过程名称。

到目前为止我能理解

然后我在Excel VBA编辑器中手动计算了UserForm的事件过程下拉列表,发现有22个UserForm事件过程。
但在我使用TLI运行以下代码之后,结果列表仅包含16个事件过程,如第一张照片所示。
我正在使用FM20.dll中的MSForms类/对象。
代码如下:(需要参考C:\Windows\SysWow64\TLBINF32.DLL上的TypeLib信息库)

未列出6个事件,包括UserForm.Activate和UserForm.QueryClose等。

我的问题是,为什么没有列出这6个事件程序?
如果这些事件过程不是从FM20.dll中的TypeLib中提取的,它们来自哪里?

对象浏览器也只显示16个过程。

还是我在使用TLI库时做错了什么?

我承认我还远远没有成为一名专家。
我仍在努力理解TypeLib信息是如何工作的。

如何获取所有22个事件过程名称?

我需要事件过程名称来区分用户定义过程与我的项目中UserForm CodeModule中的事件过程,该项目将列出VBA项目中的过程调用。
我也找不到有人问同样的问题

编辑:021年2月8日

  • 添加项目用户表单图像+缩放图像,以清晰显示和更好地解释问题
  • 在下面的缩放照片中,
    A->,用户窗体控件“默认事件过程”名称
    B->,UserForm默认事件过程名称
    C->,用户定义的子+函数驻留在UserForm CodeModule中
  • 为获得更好的清晰度,上述图像被放大。
    ***********************************************************
    我想将BC分开,就像我对A所做的那样
    ***********************************************************
    这样我们就可以知道默认事件过程没有被直接调用。

    下面的图片是为了更好地了解我为什么需要列出UserForm事件过程的名称。

    道歉
    我为有点政治性而道歉(如果你想叫函数名politics!)。
    我真的很抱歉要在这里涉及一点政治。
    除了你的觉知,我什么都不要求。如果你愿意,请投我反对票,因为我做了一个人在国家最需要他的时候需要做的事。
    作为一名缅甸公民,我只想做点什么,不管它有多小。
    通常,我对政治不感兴趣,但当前的形势要求我让世界知道,缅甸目前正受到军事政变的围困,军事政变强行推翻了民选政府,目前正在压迫其公民的权利。
    请容忍我,我希望你们都能理解和同情我。

    感谢您的理解。

    TLBINF32.DLL执行其设计(编码)功能,因此您无法让它识别与MSForm的多个“打开/关闭”步骤相关的五个事件,或者MSForm自己的窗口调整大小事件。例如,如果要在代码中使用它们,可以为所需的事件名称创建字符串常量,或将它们保存在工作表的查找表中,或保存在要读取的文本文件中,或以适合项目的其他方式保存

    至于列出Excel UserForm控件,您根本不需要TLBINF32.DLL,因为它已经构建到MSForm类中(很明显,因为TLBINF32.DLL只是利用了它)。要测试这一点,请创建一个窗体,命名为“Form1”,加入一些控件,并从VBA项目中的任何位置运行以下简单的子例程:

    Sub ExamineControls()
        Dim ctl As Control
    
        For Each ctl In Form1.Controls
            Debug.Print ctl.Name, ctl.Top, ctl.Visible '  anything else you need?
        Next
    End Sub
    
    Form1是否打开并不重要


    我希望这会有所帮助。

    Think OP希望收集所有现有事件过程的名称,而不是ctrl属性的指定内容:-@T.M.--那么,真的,你在我的回答中不明白的是什么?请你详细说明一下好吗?问题是:“我的问题是,为什么这6个事件过程没有被列出?或者我在使用TLI库时做错了什么?”@T.M.,你是对的。我只想列出现有事件过程的名称。另一方面,我可以轻松管理ctrl属性。我也在typelib信息中找到了ctrl属性。它们通常作为coclass的第一个接口的成员,有时与其他内容混合在一起,而事件位于第二个接口中,即如果使用ClassInfo对象方法。谢谢你善意的回答和支持。@Gene,谢谢你善意的回答。对不起,我把你弄糊涂了。是我的错。添加了两张照片以更好地澄清我的问题。首先,TLBINF32肯定在做它的工作,问题是我。仍在学习,因此我认为我没有调用正确的过程/正确的参数,因此得到了垃圾输出。第二,正如你所说,我可以硬编码这6个名字,同时使用typelib获取其他16个名字。I j
    Sub ExamineControls()
        Dim ctl As Control
    
        For Each ctl In Form1.Controls
            Debug.Print ctl.Name, ctl.Top, ctl.Visible '  anything else you need?
        Next
    End Sub