VBA checkbook动态添加后,添加事件方式
2015-04-20 23:18
288 查看
经过一段时间的学习,研究了一下VBA中的checkbook控件,真是让我哭笑不得呀!
类模块添加事件法:
一、 写一个类名为chk的类
Option Explicit
Public WithEvents obj As MSForms.CheckBox
Private Sub obj_Change()
Dim n
n = Val(Replace(obj.Name, "CheckBox", ""))
Sheets(1).Range("B" & n).Interior.ColorIndex = IIf(obj.Value, 13, 0)
End Sub
二、在标准模型中写
Option Explicit
Public co As New Collection
Public Sub OBJ_INI(sht As Worksheet) '初始化控件,绑定到同一事件
Dim obj As Object
Dim myc As chk
Set co = Nothing
For Each obj In sht.OLEObjects
’两种寻找sheet页上checkbook的方式
' If obj.Name Like "CheckBox*" Then '该处为按钮对象,也可换其他!
' Set myc = New chk
' MsgBox obj.Name
' Set myc.obj = CallByName(sht, obj.Name, VbGet)
' co.Add myc
' End If
With obj
Select Case TypeName(.Object)
Case "CheckBox"
Set myc = New chk
Set myc.obj = .Object
MsgBox .Name
co.Add myc
End Select
End With
Next
Set myc = Nothing
End Sub
三、在ThisWorkbook中写
Private Sub Workbook_Open()
OBJ_INI Sheet1
End Sub
打开文件后自动执行
但是当我想尝试动态加载checkbook时,就时让sheet中checkbook数目不定时,无法调用类模块中的事件,找了好久都没解决,好揪心。。。。。
上述是ActiveX中的控件,属性多,但是事件不好处理,特别注意的是,当你改变checkbook的值时会自动触发它的click事件,这是在太悲催了,有时候Application.EnableEvents = False完全不好用,真是醉了,最后想破脑袋决定用一个isClick状态来标记我是点击事件触发的事件还是修改值触发的事件。勉强解决了。
利用checkbooks的OnAction来绑定事件,不过目前只有form中checkbook控件好用,难道这就是两者的差别么,又醉一次。
一、在sheet中
Private Sub CommandButton1_Click()
Call Module1.aaa ‘一个button调用一个方法
End Sub
二、在标准模型中
Public Function aaa()
Dim i As Integer
For i = 1 To 3
ActiveSheet.CheckBoxes.Add(322.5 + i * 10, 119.25 + i * 10, 100.5 + i * 10, 45.75 + i * 10).Select
With Selection
.Value = xlOn
.LinkedCell = "$J" & i
.Display3DShading = True
.OnAction = "abc(" & Selection & ")"
.Name = "CheckBox" & i
.Caption = "CheckBox" & i
End With
Next
End Function
Private Function abc(item As CheckBox)
MsgBox item.LinkedCell
End Function
呵,终于满足我了,可以动态创建checkbook,并有一个统一的事件,当debug时,发现即使form中的checkbook没有属性,但是debug到该对象时还是跟Active中的checkbook属性一样多呢,不一定都好使,但是只定会有意外收获哦。
利用打印代码的形式,来实现动态checkbook的事件绑定,利用InsertLines来动态制定事件
Sub MakeButton()
'
Dim WSheet As Worksheet
Dim MyNewbtn As OLEObject
Dim startRange As Range
Dim ShtCodeName As String
Dim newCtrlName As String
Dimcnt As Integer
Dim icount As Integer
SetWSheet = ThisWorkbook.ActiveSheet
'WSheet.Name = "sheet1"
icount= WSheet.Cells(1, 1)
icount = icount + 1
WSheet.Cells(1, 1) = icount
Set startRange = Range("B" & icount + 1)
Set MyNewbtn = WSheet.OLEObjects.Add(ClassType:="Forms.checkbox.1",Link:=False _
, DisplayAsIcon:=False, Left:=startRange.Left + 10, Top:=startRange.Top + 2, _
Width:=startRange.Width - 14, Height:=startRange.Height - 3)
MyNewbtn.Name = "MyNewButton" & icount
MyNewbtn.Object.Caption = "新checkbox"'
ShtCodeName= WSheet.CodeName
newCtrlName = MyNewbtn.Name
'ShtCodeName = ThisWorkbook.Worksheets("sheet1").CodeName
cnt = ThisWorkbook.VBProject.VBComponents.Item("Sheet1").CodeModule.CountOfLines
With ThisWorkbook.VBProject.VBComponents.Item(ShtCodeName).CodeModule
.InsertLines cnt + 1, "Private Sub " & newCtrlName &"_Click()"
.InsertLines cnt + 2, "msgbox ""呵呵呵。"""
.InsertLines cnt + 3, "End Sub"
End With
End Sub
对form中的checkbook和Active中的checkbook一样可用,就是有些笨拙,但是很好用。
类模块添加事件法:
一、 写一个类名为chk的类
Option Explicit
Public WithEvents obj As MSForms.CheckBox
Private Sub obj_Change()
Dim n
n = Val(Replace(obj.Name, "CheckBox", ""))
Sheets(1).Range("B" & n).Interior.ColorIndex = IIf(obj.Value, 13, 0)
End Sub
二、在标准模型中写
Option Explicit
Public co As New Collection
Public Sub OBJ_INI(sht As Worksheet) '初始化控件,绑定到同一事件
Dim obj As Object
Dim myc As chk
Set co = Nothing
For Each obj In sht.OLEObjects
’两种寻找sheet页上checkbook的方式
' If obj.Name Like "CheckBox*" Then '该处为按钮对象,也可换其他!
' Set myc = New chk
' MsgBox obj.Name
' Set myc.obj = CallByName(sht, obj.Name, VbGet)
' co.Add myc
' End If
With obj
Select Case TypeName(.Object)
Case "CheckBox"
Set myc = New chk
Set myc.obj = .Object
MsgBox .Name
co.Add myc
End Select
End With
Next
Set myc = Nothing
End Sub
三、在ThisWorkbook中写
Private Sub Workbook_Open()
OBJ_INI Sheet1
End Sub
打开文件后自动执行
但是当我想尝试动态加载checkbook时,就时让sheet中checkbook数目不定时,无法调用类模块中的事件,找了好久都没解决,好揪心。。。。。
上述是ActiveX中的控件,属性多,但是事件不好处理,特别注意的是,当你改变checkbook的值时会自动触发它的click事件,这是在太悲催了,有时候Application.EnableEvents = False完全不好用,真是醉了,最后想破脑袋决定用一个isClick状态来标记我是点击事件触发的事件还是修改值触发的事件。勉强解决了。
利用checkbooks的OnAction来绑定事件,不过目前只有form中checkbook控件好用,难道这就是两者的差别么,又醉一次。
一、在sheet中
Private Sub CommandButton1_Click()
Call Module1.aaa ‘一个button调用一个方法
End Sub
二、在标准模型中
Public Function aaa()
Dim i As Integer
For i = 1 To 3
ActiveSheet.CheckBoxes.Add(322.5 + i * 10, 119.25 + i * 10, 100.5 + i * 10, 45.75 + i * 10).Select
With Selection
.Value = xlOn
.LinkedCell = "$J" & i
.Display3DShading = True
.OnAction = "abc(" & Selection & ")"
.Name = "CheckBox" & i
.Caption = "CheckBox" & i
End With
Next
End Function
Private Function abc(item As CheckBox)
MsgBox item.LinkedCell
End Function
呵,终于满足我了,可以动态创建checkbook,并有一个统一的事件,当debug时,发现即使form中的checkbook没有属性,但是debug到该对象时还是跟Active中的checkbook属性一样多呢,不一定都好使,但是只定会有意外收获哦。
利用打印代码的形式,来实现动态checkbook的事件绑定,利用InsertLines来动态制定事件
Sub MakeButton()
'
Dim WSheet As Worksheet
Dim MyNewbtn As OLEObject
Dim startRange As Range
Dim ShtCodeName As String
Dim newCtrlName As String
Dimcnt As Integer
Dim icount As Integer
SetWSheet = ThisWorkbook.ActiveSheet
'WSheet.Name = "sheet1"
icount= WSheet.Cells(1, 1)
icount = icount + 1
WSheet.Cells(1, 1) = icount
Set startRange = Range("B" & icount + 1)
Set MyNewbtn = WSheet.OLEObjects.Add(ClassType:="Forms.checkbox.1",Link:=False _
, DisplayAsIcon:=False, Left:=startRange.Left + 10, Top:=startRange.Top + 2, _
Width:=startRange.Width - 14, Height:=startRange.Height - 3)
MyNewbtn.Name = "MyNewButton" & icount
MyNewbtn.Object.Caption = "新checkbox"'
ShtCodeName= WSheet.CodeName
newCtrlName = MyNewbtn.Name
'ShtCodeName = ThisWorkbook.Worksheets("sheet1").CodeName
cnt = ThisWorkbook.VBProject.VBComponents.Item("Sheet1").CodeModule.CountOfLines
With ThisWorkbook.VBProject.VBComponents.Item(ShtCodeName).CodeModule
.InsertLines cnt + 1, "Private Sub " & newCtrlName &"_Click()"
.InsertLines cnt + 2, "msgbox ""呵呵呵。"""
.InsertLines cnt + 3, "End Sub"
End With
End Sub
对form中的checkbook和Active中的checkbook一样可用,就是有些笨拙,但是很好用。
相关文章推荐
- jquery动态为添加的元素绑定事件如果需要两种以上形参的话拼接方式
- 页面元素用JS动态添加的有效事件绑定方式
- 页面元素用JS动态添加的有效事件绑定方式(on)
- 动态添加点击事件,传参数的比较严谨,以及兼容大部分浏览器的方式
- C#: 根据事件名称动态添加事件
- Ext.Net动态创建按钮-动态添加事件
- js动态添加事件
- 给动态添加的元素绑定事件
- jquery处理动态生成的元素添加事件
- easy-ui中表格中动态添加checkbox,和全选事件和判断选中事件
- Js动态添加事件 实现附加自己的事件属性
- ScrollView动态添加控件,并设定绑定事件
- jquery动态添加元素无法触发绑定事件的解决方案
- 用js脚本如何动态添加带参数的事件
- ExtJS4 动态添加列的两种方式
- Jquery动态添加节点,绑定事件失效的解决方法
- 安卓中通过循环动态添加了一堆自定义的控件,怎么给这些控件绑定事件?
- android监听事件添加动作的三种方式
- c# TableLayoutPanel控件应用 动态添加控件及事件
- ListView添加动态悬浮header的另类方式