【问题标题】:Excel VBA: How to detect which control was clicked?Excel VBA:如何检测单击了哪个控件?
【发布时间】:2014-10-28 05:58:39
【问题描述】:

我的工作表可以根据需要动态添加一系列ActiveX标签,命名为“lblLong1”、“lblLong2”等。当用户点击一个标签时,我想获取 Caption 中的文本并在不同的宏中使用它。

蛮力方法是为每个可能的标签编写一个 Click 事件,即使是那些当前不存在的标签。例如:

Private Sub lblLong3_Click()
    Dim t As String
    t = Me.lblLong3.Caption
    Call Macro1(t)
End Sub

我确信我可以写出 30 个这样的内容,但这不是最好的方法,不是吗?有更好的方法吗?

谢谢。

【问题讨论】:

    标签: vba excel controls


    【解决方案1】:

    多年来,我已经多次探讨过这个问题。编写此代码的最短方法是进行函数调用,将单击的控件标题传递给 VBA 子程序或函数。您仍然需要为每个可点击控件设置一个事件。

    Private Sub lblLong3_Click()
        Call Macro1(Me.lblLong3.Caption)
    End Sub
    
    Private Sub Macro1(strCaption As String)
        ' Code To Execute
    End Sub
    

    解决此问题的唯一方法是使用带有计时器事件的“Form.ActiveControl”来识别具有焦点的控件。只需在例程中放置一个标志,以便它只运行一次,除非具有焦点的控件发生更改。但请注意“Tab”按钮,因为随着焦点的变化,它可能会导致例程的大量意外运行。

    您可以使用“标签”属性让它只检查您想要的控件。对于要检查的每个控件,将其设置为“CheckMe”,对于这些相同的控件,将“tab”属性设置为 false,并按如下方式使用。

    Dim strLastCaption As String
    
    Private Sub Form_Timer()
        If me.ActiveControl.Tag = "CheckMe" Then
            If Me.ActiveControl.Caption <> strLastCaption Then
                strLastCaption = Me.ActiveControl.Caption
                Call Macro1(strLastCaption)
            End If
        End If
    End Sub
    

    【讨论】:

    • 听起来你在说我建议的方法是唯一真正的方法。对吗?
    • 没错。在很多场合都经历过这种情况,尝试与您尝试做的完全相同的事情。没有更短的方法可以实现这一点。无论您从什么途径或角度处理该事件,该事件在某种程度上都是必需的。我真的很想有办法……但它不会发生。
    • 刚刚添加了一种可能有效的方法,但它本身就很少。
    • 在修改后的答案中发布的代码可能会有所帮助。
    • 我一直在做一些阅读,似乎通过使用自定义类模块和 WithEvents——我一无所知的两件事——可以让你编写一次事件代码并将其应用于多个控件.这是 VBA Express 上的一个示例:vbaexpress.com/forum/archive/index.php/t-31316.html
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多