【问题标题】:How to tell which dynamic control sent to an event?如何判断哪个动态控件发送到一个事件?
【发布时间】:2016-06-06 14:11:19
【问题描述】:

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

我用下面的代码创建了一个类对象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 循环更改该行上的其他控件。

【问题讨论】:

  • CHK 变量包含您需要了解的有关复选框的所有信息 - 将 MsgBox Chk.Name 添加到您的 CHK_Change 代码中,它将为您提供名称。
  • @DarrenBartrup-Cook 做到了!!!!谢谢!

标签: vba excel


【解决方案1】:

我不太确定我是否正确理解了您的问题。但在我看来,它归结为“哪个 FormControl(链接到特定过程)导致该子运行”。如果是这种情况,那么您应该能够使用

Application.Caller

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

【讨论】:

  • 我澄清了。我正在尝试从用户表单上动态创建的控件中获取信息,该控件将用于更改相关控件。我尝试了应用程序调用程序并收到类型不匹配错误。 (错误 2023)
  • 表单上的复选框对每个复选框都有一个事件处理程序。上面的示例仅适用,因为我能够将相同的sub 分配给两个控件。然而,在表单上,​​每个控件都为每个事件CheckBox1_ClickCheckBox2_ClickCheckBox3_Click 等获取自己的子控件。它们不能共享一个子控件。因此,Application.Caller 在这里没有多大意义。
  • 谢谢,我不知道。我将把它用于另一个项目。
【解决方案2】:

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

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

将此代码添加到表单(注意 - 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多