有 VBA 编码经验的人可以解释一下这种疯狂吗?
Dim thisForm As MSForms.UserForm
Set thisForm = ACADProject.FormENU
'FormENU is user form I have, with some controls in it,
'with a little piece of data in the caption so that it's visible
'when the form is shown
'When I do this
Debug.Print thisForm.Caption
'I get ""
'When I do this
Debug.Print thisForm.Controls(1).Parent.Caption
'I get the actual caption of the Form
为什么在我向其控件之一询问此表单之前它不知道其标题? 我从调用嵌套在模块中的过程的表单中的命令按钮执行此操作
最佳答案
这似乎是由于基类的属性未正确映射到子类属性的错误所致!
ACADProject.FormENU
继承自MSForms.UserForm
。它比 MSForms.UserForm
有更多的属性和方法。 ,但是它is a MSForms.UserForm
,因此它可以存储在 MSForms.UserForm
类型的变量中.
内部看来MSForms.UserForm
及其子类(用户设计的实际用户表单)被实现为不同的对象,其中基本虚拟对象的属性返回实际派生对象返回的属性(这使得它看起来更像是一个 has-a 来自上面的链接,而不是 is-a)。
看来谁映射了 MSForms.UserForm
的所有属性返回实际子类的各自值,忘记映射 Caption
属性:
Dim FormAsSelf As UserForm1
Dim FormAsForm As MSForms.UserForm
Dim FormAsObject As Object
Set FormAsSelf = New UserForm1
Set FormAsForm = FormAsSelf
Set FormAsObject = FormAsSelf
Debug.Print "Caption from self: ", FormAsSelf.Caption, TypeName(FormAsSelf), ObjPtr(FormAsSelf), TypeOf FormAsSelf Is UserForm1
Debug.Print "Caption from form: ", FormAsForm.Caption, TypeName(FormAsForm), ObjPtr(FormAsForm), TypeOf FormAsForm Is UserForm1
Debug.Print "Caption from object: ", FormAsObject.Caption, TypeName(FormAsObject), ObjPtr(FormAsObject), TypeOf FormAsObject Is UserForm1
Unload FormAsSelf
UserForm
?其他属性似乎已正确映射,因此如果您设计一个粉红色背景的表单并请求 .BackColor
而不是.Caption
在上面的代码中,您将从表单的所有三个(实际上是两个)“侧面”得到相同的答案:
UserForm
?如上所述in a comment在相关问题下,整个继承情况类似于 Sheet1
之间的关系和Worksheet
。然而,这些似乎在内部实现不同,因此只有一个“方面”可以开始:
Dim SheetAsSelf As Sheet1
Dim SheetAsSheet As Excel.Worksheet
Dim SheetAsObject As Object
Set SheetAsSelf = ThisWorkbook.Worksheets(1)
Set SheetAsSheet = SheetAsSelf
Set SheetAsObject = SheetAsSelf
Debug.Print "Caption from self: ", SheetAsSelf.Name, TypeName(SheetAsSelf), ObjPtr(SheetAsSelf), TypeOf SheetAsSelf Is Sheet1
Debug.Print "Caption from sheet: ", SheetAsSheet.Name, TypeName(SheetAsSheet), ObjPtr(SheetAsSheet), TypeOf SheetAsSheet Is Sheet1
Debug.Print "Caption from object: ", SheetAsObject.Name, TypeName(SheetAsObject), ObjPtr(SheetAsObject), TypeOf SheetAsObject Is Sheet1
Sheet1
?(不过,如果你深入挖掘,你会发现工作表甚至是 crazier shenanigans !)
关于vba - UserForm.Caption 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957774/