excel - 将 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':类型不匹配
解决方案
我得到一个类型不匹配,因为调用复选框会返回它的状态而不是整个对象。有没有办法得到整个对象?
错误的假设,你得到了“整个对象”,但是你得到的对象没有实现你期望的接口,因此类型 mismatch。
您需要使用MSForms
库明确限定您的 MSForms 类型,如下所示:
Private Function makeMyCheckBox(ByVal c As MSForms.CheckBox) As MyCheckBox
否则,不合格的CheckBox
标识符/类型名称指的是Excel.CheckBox
,因为宿主应用程序的对象模型(Excel
库)总是比引用的库具有更高的优先级MSForms
,在项目引用对话框中:
这在香草 VBE 中很难发现。使用Rubberduck,您只需将插入符号放在上面CheckBox
,它就会告诉您它的来源:
如果没有任何加载项,您必须猜测实际类型是什么,因为Shift+ F2(通常会将您带到Object Browser中的定义)对此毫无用处 - 您得到的只是一条消息,说“下面的标识符光标无法识别”。
免责声明:我管理 Rubberduck 开源项目。
推荐阅读
- android - 无法从静态方法 Flutter 访问实例成员
- c++ - 卤化物函数构造函数
- ansible - 使用 Ansible Molecule 进行测试时如何跳过一些角色任务?
- java - “getText”语法不起作用并且显示错误
- c++ - 相同的方程和相同的参数为什么返回不同的计算结果?
- python - 是否有一个函数可以从 python 列表的 m 个元素中获取 n 个元素?
- c++ - opencv c++ 加载图像,得到非常大的像素值
- swift - 如何创建大型 NSView/UIView 的“迷你地图”?
- sql - SQL - 为什么我需要转换为十进制?
- java - 我想遍历图像的数组列表