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