如何判断发送给事件的动态控件?

时间:2016-06-06 14:11:19

标签: excel vba excel-vba

这是我第一次尝试在用户表单中使用动态创建的控件。原因是某些处理返回的行总是不同。

我使用以下代码创建了一个类对象 cControlEvent 。 (我删除了与复选框无关的代码)

Public WithEvents CHK As MSForms.CheckBox


Private Sub CHK_Change()
   ** tell me which box was changed **
End Sub

在代码模块中,我有以下代码:

Dim CHK_Evts As New Collection 

sub Form_Builder()

**non relevant code deleted****
    Set Evt = New cControlEvent
    If i_Columns = 1 Then
        Set Evt.CHK = ctl
        CHK_Evts.Add Evt
    Else
**  more code**
    End if
end sub

我需要更改/添加什么才能获取触发更改事件的控件的名称?

编辑添加:

我在用户表单的每一行上都有一系列动态创建的复选框和文本框,每行前面都有一个复选框,当选中/取消选中复选框时,我需要更改该行中所有文本框的背景颜色。每个控件都按其类型命名,然后行然后列如此CHX_1_1将是第1行第1列的复选框,TXT_1_5将是第1行第5列。所以,如果我知道复选框的名称是什么,我拥有所有我需要使用简单的for-next循环更改该行上的其他控件。

2 个答案:

答案 0 :(得分:1)

我不太确定我是否理解你的问题。但在我看来,它归结为"哪个FormControl(链接到特定的程序)导致该子运行"。如果是这样,那么你应该可以使用

Application.Caller

这是一段简短的视频,展示了它在非常简单的环境中的应用:

enter image description here

答案 1 :(得分:1)

希望这是一个完整的解决方案,展示如何从复选框中获取属性:

创建一个空白用户窗体并向其添加一个命令按钮。

将此代码添加到表单中(注意 - CommandButton1_Click应更新为您添加的按钮的名称。

Public CHK_Evts As New Collection

Private Sub CommandButton1_Click()

    Dim ChkBox As Variant

    For Each ChkBox In CHK_Evts
        MsgBox ChkBox.Position & vbCr & _
                ChkBox.Status
    Next ChkBox

End Sub

Private Sub UserForm_Initialize()
    Dim tmpCtrl As Control
    Dim cmbEvent As clsControlEvents
    Dim X As Long

    For X = 1 To 10
        Set tmpCtrl = frmNameParser.Controls.Add("Forms.Checkbox.1", "Name" & X)
        With tmpCtrl
            .Left = 6
            .Top = X * 20 + 24
            .Height = 18
            .Width = 150
        End With

        Set cmbEvent = New clsControlEvents
        Set cmbEvent.CHK = tmpCtrl
        CHK_Evts.Add cmbEvent, "Name" & X
    Next X

End Sub

创建一个名为clsControlEvents的类并添加以下代码:

Public WithEvents CHK As MSForms.CheckBox

Public Property Get Position() As String
    Position = CHK.Top
End Property

Public Property Get Status() As String
    Status = CHK.Value
End Property

Private Sub CHK_Click()
    MsgBox CHK.Name
End Sub

两个GET程序将信息传递回CommandButton1_Click程序,以便列出表单上所有复选框的信息(保存在CHK_EVTS集合中)。
CHK_Click过程提供有关单击复选框的即时信息。

http://www.cpearson.com/excel/classes.aspx