在多页中获取Activecontrol

时间:2017-12-11 02:27:07

标签: vba excel-vba excel

我正在尝试获取我刚刚选择的Listbox的名称(“ListBox1”)。
警告:ListBox1位于Multipage1内(在第一个标签页上)。

Private Sub ListBox1_Click()
Dim m As String

m = Me.ActiveControl.Name
MsgBox (m)
End Sub

由于我选择了ListBox1,我希望消息框值为 ListBox1
相反,我正在接收 Multipage1

我应该做些什么?

2 个答案:

答案 0 :(得分:1)

将MultiPage,Pages和Frame视为子表单会有所帮助。如果子窗体控件处于活动状态,则父窗体将返回子窗体作为ActiveControl。

这是深入了解实际ActiveControl的正确方法。

Function ActiveControlName(Object As Object) As String
    Dim Obj As Object
    On Error Resume Next
    Set Obj = Object.ActiveControl
    If Err.Number = 0 Then
        ActiveControlName = ActiveControlName(Object.ActiveControl)
    Else
        Set Obj = Object.SelectedItem
        If Err.Number = 0 Then
            ActiveControlName = ActiveControlName(Object.SelectedItem)
        Else
            ActiveControlName = Object.Name
        End If
    End If
    On Error GoTo 0
End Function

演示

enter image description here

答案 1 :(得分:0)

一个旧帖子,但我登陆时遇到了同样的问题。不幸的是,这个答案不适用于我的情况(控件位于多页嵌套框架中)。但是user6432984取得了很大的进步。

正确解决方案的关键是活动控件(由“ ActiveControl”报告)是在用户窗体上活动的顶级控件。它可能有:

1)另一个嵌套的“ ActiveControl”,
2)一个“ SelectedItem”
3)以上都不是-在这种情况下,它确实是您想要的“ ActiveControl”。

因此,向下钻取的技术要求您确定上面的1),2)或3)中的哪一个。如果您没有3)继续抛出1)或2)中的任何一个,则必须进入递归函数,直到找到3):

Function ActiveControlName(Object As Object) As String
'modified my Malcolm Farrelle
Dim Obj As Object
Set Obj = Nothing
On Error Resume Next
Set Obj = Object.ActiveControl
On Error GoTo 0
If Obj Is Nothing Then
    On Error Resume Next
    Set Obj = Object.SelectedItem
    On Error GoTo 0
End If
If Obj Is Nothing Then
    ActiveControlName = Object.Name
Else
    ActiveControlName = ActiveControlName(Obj)
End If
End Function