Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class VBA用户窗体对象_Class_Vba_Ms Office_Userform - Fatal编程技术网

Class VBA用户窗体对象

Class VBA用户窗体对象,class,vba,ms-office,userform,Class,Vba,Ms Office,Userform,我真的有点纠结。我有一个类模块,我们称之为FormMan,它有一系列与我的项目中的大量用户表单相关的方法。一个特殊的方法是从许多不同的地方调用,非常简单——它只需向表单添加用户定义数量的控件,并扩展表单高度以适应这些新控件 用户传递控件数和userform oF.AddControlsToForm iNumberOfControls,frmTest 在FormMan类模块中: Public Sub Addcontrols(iNum as integer, oForm as userform)

我真的有点纠结。我有一个类模块,我们称之为FormMan,它有一系列与我的项目中的大量用户表单相关的方法。一个特殊的方法是从许多不同的地方调用,非常简单——它只需向表单添加用户定义数量的控件,并扩展表单高度以适应这些新控件

用户传递控件数和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之前,我尝试加载并显示表单

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


非常感谢您的帮助。

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

您可能不得不将函数参数声明为对象

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

这应该按照您的意愿工作,尽管不幸的是您将牺牲类型安全性。在VBA环境中,大多数OO概念往往会分崩离析。

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

您可能不得不将函数参数声明为对象

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

这应该按照您的意愿工作,尽管不幸的是您将牺牲类型安全性。大多数OO概念在VBA的上下文中往往会分崩离析。

关于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

这不是很奇怪吗?!?!我没有现成的代码示例,因此我不能保证成功,但这似乎是正确的方法。

关于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

这不是很奇怪吗?!?!我没有现成的代码示例,因此我不能保证成功,但这似乎是正确的方法。

在开始这个项目之前,我做了很好的调整。谢谢你的帮助,没问题!随着时间的推移,我已经学会了热爱VBA,如果b/c Excel是一个非常强大的应用程序背景的话。在我开始这个项目之前,我已经做了很好的调整。谢谢你的帮助,没问题!随着时间的推移,我已经学会了热爱VBA,如果b/c Excel是一个非常强大的应用程序背景的话。