VBA用户窗体对象

时间:2009-02-12 21:04:17

标签: class vba ms-office userform

我真的在这里苦苦挣扎。我有一个类模块,让我们称之为FormMan,它有一堆与我项目中的大量用户表单相关的方法。一个特定的方法是从很多不同的地方调用并且非常简单 - 它只是向表单添加用户定义的控件数量,并扩展表单高度以适应这些新控件。

用户传递控件数和用户表单。

oF.AddControlsToForm iNumberOfControls,frmTest

在FormMan类模块中:

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

在Locals窗口中,oForm没有height属性,所以足够公平。但oForm被定义为frmTest。我可以说oForm.BackColor = vbred,我可以设置ctl = oform.TextBox1例如

这是一个通用的过程,可以为任何形式添加一堆控件。我已经尝试加载并显示表单,然后将其分配给oForm。

为什么height和show属性和用户形式的方法,而不是声明为userforms的对象?我做错了什么?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

这里的问题是UserForm和frmTest对象的类型不同。实际上,frmTest是UserForm的子类型,它通过在其他成员中添加Height属性来扩展它。

您可能不得不求助于将函数参数声明为Object。

Public Sub Addcontrols(iNum as integer, oForm as Object)

这应该按照你的意愿工作,虽然不幸的是你会牺牲类型的安全性。在VBA的背景下,大多数OO概念都会崩溃。

答案 1 :(得分:1)

首先要记住关于VBA的事情是它是准OO,而不是完全OO。我在这个问题上遇到了很多古怪的问题,所以我现在倾向于完全不依赖于VBA的一致性。

话虽如此,试试这个:

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

这不是很奇怪吗?!?!我没有准备好等待的代码示例,所以我不能保证成功,但这感觉就像是正确的方法。