我真的在这里苦苦挣扎。我有一个类模块,让我们称之为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的对象?我做错了什么?
非常感谢任何帮助。
答案 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
这不是很奇怪吗?!?!我没有准备好等待的代码示例,所以我不能保证成功,但这感觉就像是正确的方法。