将CheckBox控件的dim设置为UserForm CheckBox

时间:2019-07-09 17:12:42

标签: excel vba

我正在尝试创建一个基于复选框控件的类模块。在类模块中,我要指向用户表单中的复选框。虽然,当我尝试用用户窗体中的复选框之一填充CheckBox对象时,我遇到类型不匹配的情况,因为调用复选框会返回其状态而不是整个对象的状态。有没有办法获得整个物体?

我尝试过

set myCheckBox = makeMyCheckBox(Me.CheckBox1)

set myCheckBox = makeMyCheckBox(Me.CheckBox1.Object)

其中makeMyCheckBox是一个接受CheckBox对象并创建新MyCheckBox对象的函数。

'Within my userform's code

Dim myCheckBoxes(1 to 2) As MyCheckBox 'MyCheckBox is my class module

Private Sub UserForm_Initialize()
set myCheckBoxes(1) = makeMyCheckBox(me.CheckBox1)'<--Error Type Mismatch
End Sub

Private Function makeMyCheckBox(c As CheckBox) As MyCheckBox 
Dim myChck As MyCheckBox 
Set myChck = New MyCheckBox 
myChck.init c 'takes in a CheckBox and fills its internal CheckBox object
Set makeMyCheckBox= myChck 
End Function

我希望Me.CheckBox1是一个CheckBox对象。 当我在调试中查看时,Me.CheckBox1输出复选框的状态(对/错)

我得到- 运行时错误“ 13”: 类型不匹配

1 个答案:

答案 0 :(得分:1)

  

我遇到类型不匹配的情况,因为调用复选框会返回其状态而不是整个对象的状态。有没有办法获得整个物体?

错误的假设是,您获得了“整个对象”,但是获得的对象没有实现您期望的接口,因此,类型不匹配

您需要使用MSForms库明确限定MSForms类型,如下所示:

Private Function makeMyCheckBox(ByVal c As MSForms.CheckBox) As MyCheckBox 

否则,不合格的CheckBox标识符/类型名称将引用Excel.CheckBox,因为主机应用程序的对象模型(Excel库)始终具有比引用的{{1 }}库,在项目引用对话框中:

Microsoft Excel 16.0 object library showing before Microsoft Forms 2.0 object library

这在香草VBE中很难发现。使用Rubberduck,您只需将插入号放在MSForms上,它会告诉您它的来源:

Excel checkbox

MSForms checkbox

没有任何加载项,您就必须猜测实际类型是什么,因为 Shift + F2 (通常需要为此,您对对象浏览器中的定义是没有用的-您得到的只是一条消息,指出“无法识别光标下的标识符”。

  

免责声明:我管理Rubberduck开源项目。