我有一个问题,但是找不到答案。
我正在以编程方式创建用户表单,并发现如果将对象声明为类型“MSForms.Userform”,似乎没有办法设置高度和宽度,因为这些属性不存在,而insideheight / insidewidth是只读属性。
我发现,如果将对象声明为通用类型“object”,则可以设置高度和宽度属性并完全按照所需使用。
因此,在初始化对象后,我检查了本地窗口,两者之间的区别似乎是:
- 当声明为类型“object”时,它将初始化为类型“UserForm1”的一个实例
- 当声明为类型“MSForms.Userform”时,它将初始化为类型“UserForm”的一个实例
因此,我的问题是,使用不同的声明语句有什么区别?
谢谢!
编辑:添加了一些示例代码,以便您可以看到在不同声明时该对象的行为不同。
(即使声明了基本语言,我也无法正确显示此代码块)
Sub TestUserForm()
'NOTE: You need to add a reference to Microsoft Visual Basic
' for Applications Extensibility 5.3
'Declare variables
Dim oForm As MSForms.UserForm
Dim oForm1 As Object
Dim oComp As VBComponent
Dim oComp1 As VBComponent
'Create new form objects in the VBA project programmatically
Set oComp = Application.VBE.ActiveVBProject.VBComponents.Add(ComponentType:=vbext_ct_MSForm)
Set oComp1 = Application.VBE.ActiveVBProject.VBComponents.Add(ComponentType:=vbext_ct_MSForm)
'Initailize an object of each new form
Set oForm = VBA.UserForms.Add(oComp.Name)
Set oForm1 = VBA.UserForms.Add(oComp1.Name)
'Compare what happends when trying to set the width and height properties
With oForm1 'This works
.Height = 200
.Width = 100
End With
With oForm1 'This does not work
.Properties("Width") = 100
.Properties("Height") = 200
End With
With oForm 'This does not work
.Height = 200
.Width = 100
End With
With oForm 'This does not work
.Properties("Width") = 100
.Properties("Height") = 200
End With
'Remove the forms from the project
Application.VBE.ActiveVBProject.VBComponents.Remove oComp
Application.VBE.ActiveVBProject.VBComponents.Remove oComp1
End Sub
UserForm1
是UserForm
的一个特定实例,仅存在于您的VBA项目中。类似于Sheet1
和Worksheet
。 - Tim WilliamsUserForm
的变量类似于将一个类“向上转型”(向下转型?)到其基类。如果您使用“Locals”窗口比较oForm
和oForm1
的属性,您会发现(例如)oForm
没有Width
属性,而oForm1
有。我以前从未使用过“Properties ()”语法,并且在这种情况下似乎不适用。 - Tim Williams