VBA中的控件数组
VBA 中的控件数组 VBA 中的控件数组 2009 年 2 月 28 日 评论 发表评论大家都知道,和 VB 不一样,VBA 中不能直 接创建控件数组。 然而可以使用 WithEvents 来模拟相同的功 能。我们需要一个类来处理控件的事件,而每一个控件需要 一个类实例。对于不同控件的类实例,我们可以使用一个对 象数组或者集合来实现。 这里使用按钮控件做为例子来介绍怎样在窗体和工作表中 创建控件数组。 创建类 创建控件数组之前,我们需要一个类来处理控件的事件。 在 VBE 窗口中, 单击菜单插入- 类模块,在属性窗口中将类的名称改为 cCB。 在类模块中添加下面这一行: Private WithEvents m_CB As MSs.CommandButton 这样你就可以从代码栏的顶部左边下拉列表中选择 m_CB并 选择右边下拉列表中相应的事件。 完整的代码如下: Private WithEvents m_CB As MSs.CommandButton 初始化,将控件绑定到类 Public Sub Init(ctl As MSs.CommandButton) Set m_CB = ctl End Sub 控件的 Click 事件 Private Sub m_CB_Click() MsgBox “你点击了:“ m_CB.Caption End Sub 注销类 Private Sub Class_Terminate() Set m_CB = Nothing End Sub 窗体中的控件数组 然后创建一个窗体,在窗体中添加两个CommandButton,将 这两个按钮控件分别命名为 1 和 2, 然后在窗体中的 初始化事件中添加代码如下: Private ctlCB(1 To 2) As cCB 以对象数组保存类的实例 Private Sub User_Initialize() Set ctlCB(1) = New cCB 将按钮 1 赋给类的实例 ctlCB(1).Init 1 Set ctlCB(2) = New cCB ctlCB(2).Init 2 End Sub 这里使用对象数组 ctlCB(1 to 2)来保存类实例。每当使用Set 语句创建一个类实例,然后使用类的 Init 方法将按钮控件赋 给这个实例。 也可以使用集合来保存这个类的实例。代码如下: Private colCB As New Collection Private ctlCB As cCB 以集合保存类的实例 Private Sub User_Initialize() Set ctlCB = New cCB 将按钮 1 赋给类的实例 ctlCB.Init 1 将类的实例加入到集合中 colCB.Add ctlCB Set ctlCB = New cCB ctlCB.Init 2 colCB.Add ctlCB End Sub 点击按钮,将弹出对应的消息框。 上面的例子是将手动添加的控件添加到控件数组中。也可以 动态创建控件数组。 创建一个新的窗体,然后在窗体的初始化事件中使用 Controls 集合的 Add 方法添加 CommandButton 控件, 再将创 建好的控件赋给类实例。完整代码如下: Private ctlCB(1 To 3) As cCB Private Sub User_Initialize() Dim nCtr As MSs.CommandButton For i = 1 To 3 添加按钮控件 Set nCtr = Me.Controls.Add(“s.CommandButton.1“, “Test“ i) 设置按钮控件标题和位置 With nCtr .Caption = “CommandButton_“ i .Move 10, 10 + (i - 1) * 40, 80, 30 End With 创建 cCB 类实例 Set ctlCB(i) = New cCB 将控件赋给类实例 ctlCB(i).Init nCtr Next i End Sub 工作表中的控件数组 同样,在工作表中也可以创建控件数组(但和窗体有些不 同) 。在工作表中分别创建一个 Label 控件和三个 CommandButton 控件,如下图: 然后在 Label 控件的 Click 事件中添加如下代码: Dim Ctl() As cCB 标签控件的 Click 事件 Private Sub Label1_Click() Dim As OLEObject 所有 OLE 对象 Dim i As Integer 重新定义数组 ReDim Ctl(1 To Sheet2.OLEObjects.Count) As cCB i = 1 循环所有的 OLE 对象 For Each In Sheet2.OLEObjects 只有 CommandButton 控件才可以加入到控件数组 If .progID = “s.CommandButton.1“ Then Set Ctl(i) = New cCB Ctl(i).Init .Object i = i + 1 End If Next MsgBox “已经将工作表中所有 CommandButton 控件建成控 件数组!“, vbInation End Sub 值得注意的是使用类 cCB 的 Init 方法时,不能直接使用 变量,因为 变量是 OLEObject 类型。需要使用 变 量的 Object 属性返回 MSs.CommandButton 变量。 然而在工作表中对于动态创建的控件使用同样的方法创建 控件数组时,动态创建的控件并不响应类实例的事件。代码 如下: Dim Ctl(1 To 5) As cCB 标签控件的 Click 事件 Private Sub Label1_Click() Dim i As Integer Dim As OLEObject For i = 1 To 5 Set = Sheet3.OLEObjects.Add(ClassType:=“s.CommandButton. 1“, _ Left:=Cells(i * 3 + 3, 2).Left, Top:=Cells(i * 3 + 3, 2).Top, Width:=Cells(1, 1).Width * 2, Height:=Cells(1, 1).Height * 1.5) Set Ctl(i) = New cCB Ctl(i).Init .Object Next i MsgBox “已经成功动态创建控件数组!“, vbInation End Sub 类的实例应该是创建成功了(可以在 Init 方法中添加一些语 句来验证) ,但就是不响应 Click 事件,不知道是什