2009-02-12 176 views
0

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

用户传递控件的数量和用户窗体。

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 

在本地窗口,oForm没有高度属性,因此很公平。但oForm已被定义为frmTest。我可以说oForm.BackColor = vbred,我可以设置ctl = oform.TextBox1例如

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

为什么高度和显示用户窗体的属性和方法而不是声明为用户窗体的对象的方法?我究竟做错了什么?

真的很感谢任何帮助。

回答

4

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

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

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

这应该按照你的愿望工作,但不幸的是你会牺牲类型安全。大多数面向对象的概念往往在VBA的背景下分崩离析。

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 

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

+0

我在开始这个项目之前做了很好的调整。谢谢你的帮助。 – user51498 2009-02-12 21:28:03