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

标签 excel vba

首先,我已经了解了如何使用引用为 TLBINF32.DLL 的 Typelib 信息列出 Excel 用户窗体控件的默认事件名称。
我分享了here .
创建代码流图和可能的 VBA 代码混淆器是我正在进行的项目的一部分 early alpha version available on GitHub .
现在的问题是,尝试列出用户窗体本身的事件过程:
与使用 TLI 列出用户窗体控件不同 - ClassInfoFromObject(UserForm1.CommandButton1) ,我发现了我需要使用 TLI-TypeLibInfoFromFile("FM20.dll") 的艰难方式因为如果我使用 ClassInfoFromObject(UserForm1) , 有错误。
我还发现我可以使用 TLI- ClassInfoFromObject(ThisWorkbook.VBProject.VBComponents("UserForm1").Designer) .
使用 FM20.dll 和 .Designer 方法都可以获得 16 个事件过程名称。
到目前为止,我可以管理/理解。
然后我在Excel VBA Editor中手动统计了UserForm的事件过程下拉列表,发现有22个UserForm事件过程。
但在我使用 TLI 运行以下代码后,结果列表仅包含 16 个事件过程,如第一张照片所示。
我正在使用 FM20.dll 中的 MSForms 类/对象。
代码如下:(需要引用C:\Windows\SysWow64\TLBINF32.DLL处的TypeLib信息库)

Sub listUFEvents()
Dim t As TLI.TLIApplication
    Set t = New TLI.TLIApplication
Dim ti As TLI.TypeLibInfo
    Set ti = t.TypeLibInfoFromFile("C:\Windows\SysWOW64\FM20.dll")
Dim cci As TLI.CoClassInfo
Dim mi As TLI.MemberInfo
Dim i As Integer
    For Each cci In ti.CoClasses
        If cci.Name = "UserForm" Then
            For Each mi In cci.DefaultEventInterface.Members
                i = i + 1
                Debug.Print CStr(i), mi.Name
            Next mi
        End If
    Next cci
End Sub
6 个事件未列出,包括 UserForm.Activate 和 UserForm.QueryClose 等。comparison

我的问题是,为什么没有列出这 6 个事件程序?
如果这些事件过程不是从 FM20.dll 中的 TypeLib 中提取出来的,它们是从哪里来的呢?
对象浏览器也只显示了 16 个过程。
还是我在使用 TLI 库时做错了什么?
我承认我离成为/成为专家还很远。
我仍在尝试了解 TypeLib Info 的工作原理。
如何获得所有 22 个事件过程名称?
我需要事件过程名称来区分用户定义的过程和我项目中 UserForm CodeModule 中的事件过程,这是关于列出 VBA 项目中的过程调用。
我也找不到任何人在任何地方问同样的问题。
编辑:08FEB2021
  • 添加了项目用户表单图像+缩放之一,以清楚地显示和更好地解释问题
  • 在下面的放大照片中,
    A->,用户窗体控件的默认事件过程的名称
    B->,UserForm默认事件过程名
    C->, User-defined Sub+Function 驻留在 UserForm CodeModule

  • my project zoomed
    上面的图像被放大以获得更好的清晰度。
    ****************************************************** *********
    我要分开来自 中号就像我对 所做的那样一个 .
    ****************************************************** *********
    这样我们就可以知道没有直接调用默认事件过程。
    下图是为了更好地了解为什么我需要列出 UserForm 事件过程的名称。
    my project and question site
    道歉
    我为有点政治而道歉(如果你想把函数命名为政治!)。
    我真的很抱歉不得不在这里涉及一些政治。
    除了你的意识,我不要求任何东西。如果你愿意,请给我投反对票,因为在他的国家最需要他的时候做一个男人需要做的事情。
    作为缅甸公民,我只想做一些事情,无论它多么小。
    通常情况下,我对政治不感兴趣,但目前的情况要求我让世界知道缅甸目前正处于军事政变的包围之中,该政变强行覆盖了民选政府,目前正在压迫其公民的权利。
    请多多包涵,希望大家能理解和体谅我。
    感谢您的善意理解。

    最佳答案

    TLBINF32.DLL 执行其设计(编码)的工作,因此您无法使其识别与 MSForm 的多个“打开/关闭”步骤或 MSForm 自己的窗口的 Resize 事件相关的五个事件。如果您想在代码中使用它们,例如,您可以为所需的事件名称创建字符串常量,或者将它们保存在工作表的查找表中,或者保存在您将阅读的文本文件中,或者任何其他方式适合您的项目。
    至于列出 Excel 用户窗体控件,您根本不需要 TLBINF32.DLL,因为它已经构建到 MSForm 类中(显然,因为 TLBINF32.DLL 只是利用它)。要对此进行测试,请创建一个表单,将其命名为“Form1”,添加一些控件并从 VBA 项目中的任何位置运行以下简单子(monad)例程:

    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 是否打开并不重要。
    我希望这是有帮助的。

    关于excel - 以编程方式列出 Excel VBA 用户窗体事件过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66089105/

    相关文章:

    vba - 使用VBA创建图表,无法将X轴格式化为文本

    vba - 将选择导出到 CSV

    forms - 在用户表单之间传递数据

    c# - 将 VBA 转换为 .NET 语言

    c# - 在 C# 中从资源/程序集加载 excel 文件

    excel - 循环访问集合时尝试设置自定义对象时出错

    excel - vba:日期函数返回 "00:00:00"

    excel - 如何使标准偏差出现在状态栏中?

    Excel - 同时查找和替换公式的多个部分

    python - 错误 : Unsupported format, 或损坏的文件:预期的 BOF 记录;发现 b'<## NASC'