我正在尝试获取我刚刚选择的Listbox
的名称(“ListBox1”)。
警告:ListBox1
位于Multipage1
内(在第一个标签页上)。
Private Sub ListBox1_Click()
Dim m As String
m = Me.ActiveControl.Name
MsgBox (m)
End Sub
由于我选择了ListBox1
,我希望消息框值为 ListBox1 。
相反,我正在接收 Multipage1 。
我应该做些什么?
答案 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
答案 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