这是我第一次尝试在用户表单中使用动态创建的控件。原因是某些处理返回的行总是不同。
我使用以下代码创建了一个类对象 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循环更改该行上的其他控件。
答案 0 :(得分:1)
我不太确定我是否理解你的问题。但在我看来,它归结为"哪个FormControl(链接到特定的程序)导致该子运行"。如果是这样,那么你应该可以使用
Application.Caller
这是一段简短的视频,展示了它在非常简单的环境中的应用:
答案 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
过程提供有关单击复选框的即时信息。