楼主 amulee |
利用类模块可以减少许多重复的代码。 以给控件设定批量的Click事件为例,在工作簿中定义了以下名为clsChe的类模块:
利用该类模块,可以轻松实现对复选框进行批量设置Change事件。 在窗体中,只需要绑定窗体中的复选框即可,代码如下:
但是在工作表中似乎不太容易实现,很多人试过Shapes集合,试过CheckBoxes集合,甚至改变类模块中的定义为
但会发现,这个CheckBox类型并不支持事件。 因而会给人造成工作表中的复选框控件不是MSForms.CheckBox的错觉,其实不然。 在工作表中插入的复选框和窗体中的其实是一样的。 但是在工作表中插入的复选框增加了一层Shape外衣,使用户无法直接访问到内层的MSForms.CheckBox控件。 必须脱去层层外衣才能访问到其核心控件,其实这个真正的复选框控件在这里
我们还可以利用CALLBYNAME函数来直接访问
其余代码同窗体中是一致的。 请查看附件: 类模块示例.rar |
2楼 wqfzqgk |
|
3楼 lnjyzxp |
老师附件:类模块示例中用的:CallByName(Sheet1, "CheckBox" & i, VbGet)已能生搬硬套能用了,但还想了解一下工作表中的真正的复选框:Shapes(i).OLEFormat.Object.Object 怎么用?还请老师不吝赐教。 |
4楼 cjccchj |
还有一种方法:Sheet1.OLEObjects("CheckBox" & i).object 也是可以的。 但是有一个问题困扰了我快大半年了,就是将上述能在VBA中很容易实现的代码, 封装进VB内时,在 Set Chk(i).Chkbox = CallByName(Sheet1, "CheckBox" & i, VbGet) 语句执行时出错。错误提示是类型不匹配,怎么也找不出原因来,用TypeName(CallByName(Sheet1, "CheckBox" & i, VbGet))来验证类型是匹配的,不知总版主有啥解决办法没? |
5楼 ryueifu |
shifu, 工作表上的 Form控件,和 ActiveX控件,有什么不同? 比如,插入100个Form的chebkbox ,另一个工作簿插入100个ActiveX的checkbox 保存后,大小有区别吗? 另外,在使用上,有哪些主要区别呢 |
6楼 amulee |
个人看法:Form的CheckBox在ActiveX的CheckBox的基础上又套了一个外壳。 |