我正在尝试创建一个基于复选框控件的类模块。在类模块中,我要指向用户表单中的复选框。虽然,当我尝试用用户窗体中的复选框之一填充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”: 类型不匹配
答案 0 :(得分:1)
我遇到类型不匹配的情况,因为调用复选框会返回其状态而不是整个对象的状态。有没有办法获得整个物体?
错误的假设是,您获得了“整个对象”,但是获得的对象没有实现您期望的接口,因此,类型不匹配。
您需要使用MSForms
库明确限定MSForms类型,如下所示:
Private Function makeMyCheckBox(ByVal c As MSForms.CheckBox) As MyCheckBox
否则,不合格的CheckBox
标识符/类型名称将引用Excel.CheckBox
,因为主机应用程序的对象模型(Excel
库)始终具有比引用的{{1 }}库,在项目引用对话框中:
这在香草VBE中很难发现。使用Rubberduck,您只需将插入号放在MSForms
上,它会告诉您它的来源:
没有任何加载项,您就必须猜测实际类型是什么,因为 Shift + F2 (通常需要为此,您对对象浏览器中的定义是没有用的-您得到的只是一条消息,指出“无法识别光标下的标识符”。
免责声明:我管理Rubberduck开源项目。