首页 > 解决方案 > 将 CheckBox Control dim 设置为 UserForm CheckBox

问题描述

我正在尝试创建一个基于复选框控件的类模块。在类模块中,我想指向用户表单中的复选框。虽然,当我尝试用用户表单中的一个复选框填充 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':类型不匹配

标签: excelvba

解决方案


我得到一个类型不匹配,因为调用复选框会返回它的状态而不是整个对象。有没有办法得到整个对象?

错误的假设,你得到了“整个对象”,但是你得到的对象没有实现你期望的接口,因此类型 mismatch

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

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

否则,不合格的CheckBox标识符/类型名称指的是Excel.CheckBox,因为宿主应用程序的对象模型(Excel库)总是比引用的库具有更高的优先级MSForms,在项目引用对话框中:

Microsoft Excel 16.0 对象库显示在 Microsoft Forms 2.0 对象库之前

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

Excel 复选框

MSForms 复选框

如果没有任何加载项,您必须猜测实际类型是什么,因为Shift+ F2(通常会将您带到Object Browser中的定义)对此毫无用处 - 您得到的只是一条消息,说“下面的标识符光标无法识别”。

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


推荐阅读