如何判断哪个dynamic控件发送给一个事件?

这是我第一次尝试在用户表单中dynamic创build控件。 原因是总会有一些处理返回的行数不同。

我用下面的代码创build了一个类对象cControlEvent 。 (我删去了与checkbox无关的代码)

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 

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

编辑添加:

我在用户表单的每一行都有一系列dynamic创build的checkbox和文本框,每行之前有一个checkbox,当checkbox被选中/取消选中时,我需要更改该行中所有文本框的背景颜色。 每个控件都是按照它的types来命名的,然后是行然后列,像这样CHX_1_1将是第1行第1列的checkbox,而TXT_1_5将是第1行第5列。所以,如果我知道checkbox的名称是什么,我需要用一个简单的for-next循环来更改该行的其他控件。

我不太清楚,如果我正确理解你的问题。 但在我看来,归结为“哪个FormControl(链接到一个特定的过程)导致这个子运行”。 如果是这样的话,那么你应该可以利用这个

 Application.Caller 

这里是一个简短的video来演示它在一个非常简单的环境中使用:

在这里输入图像说明

希望这是一个完整的解决scheme,展示如何从checkbox中获取属性:

创build一个空白的用户窗体并为其添加一个命令button。

将此代码添加到窗体(注意 – CommandButton1_Click应更新为您添加的button的名称)。

 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 

创build一个名为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过程,以便可以列出有关窗体上所有checkbox的信息(保存在CHK_EVTS集合中)。
CHK_Click过程提供了有关被单击的checkbox的即时信息。

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