您的位置:首页 > 编程语言 > VB

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一样可用,就是有些笨拙,但是很好用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: