vba - UserForm.Caption 有什么问题?

标签 vba userform caption

有 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
<表类=“s-表”> <标题> 标题 标题 输入名称 对象地址 是 UserForm <正文> 来自自己的标题: 用户表单1 用户表单1 4144272 正确 表单标题: 用户表单1 96261568 正确 来自对象的标题: 用户表单1 用户表单1 4144272 正确

其他属性似乎已正确映射,因此如果您设计一个粉红色背景的表单并请求 .BackColor而不是.Caption在上面的代码中,您将从表单的所有三个(实际上是两个)“侧面”得到相同的答案:

<表类=“s-表”> <标题> 标题 背景颜色 输入名称 对象地址 是 UserForm <正文> 来自自己的标题: 16744703 用户表单1 4144272 正确 表单标题: 16744703 用户表单1 96261568 正确 来自对象的标题: 16744703 用户表单1 4144272 正确

如上所述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
<表类=“s-表”> <标题> 标题 姓名 输入名称 对象地址 是 Sheet1 <正文> 来自自己的标题: 表1 工作表 463669552 正确 来自工作表的标题: 表1 工作表 463669552 正确 来自对象的标题: 表1 工作表 463669552 正确

(不过,如果你深入挖掘,你会发现工作表甚至是 crazier shenanigans !)

关于vba - UserForm.Caption 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957774/

相关文章:

vba - 如何更新/更改所有条件规则范围的最后一行

excel - VBA 用户格式 : PREVENT COMBOBOX ESCAPE ON KEYDOWN

excel - 使用用户窗体上的文本框和指定的路径创建超链接

javascript - MediaRecorder、字幕和副标题

jquery - 如何删除(或隐藏)jqgrid 中的标题栏?

mysql - 使用Excel连续连接和断开Mysql

excel - 评估返回 -1 是否为 TRUE? (为什么不是1)

vba - 对 Excel Vba 中的 DLL 函数调用进行故障排除

excel - 双击Excel中的一个单元格,在用户窗体上打开该行的源文件

jquery - 无限轮播字幕修改