如何返回触发鼠标悬停类事件的用户窗体控件的名称?
这听起来很简单,但说实话,我一直绞尽脑汁试图找到正确的语法...
这是我的用户表单模块:
Option Explicit
Dim dArray() As New Class1
Sub Build_Controls()
Dim dImage As Object, i As Integer
For i = 1 To 3
Set dImage = UserForm1.Controls.Add("Forms.Image.1", i, True)
With dImage
.Left = (25 * i) + 20
.Width = 20
.Top = 10
.Height = 20
End With
ReDim Preserve dArray(1 To i)
Set dArray(i).dImages = dImage
Next i
End Sub
Private Sub UserForm_Activate()
Build_Controls
End Sub
我在运行时动态创建了三个图像控件,名为" 1"," 2"和" 3"。
我为每个控件分配一个mouseover事件,该事件在以下类模块中找到,名为" Class1":
Public WithEvents dImages As MSForms.Image
Private Sub dImages_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox ("Control Name") 'Which control was triggered?
End Sub
如何让MsgBox包含触发事件的控件的名称?
Me.dImages.Name 'x
ActiveControl.Name 'x
Screen.ActiveControl.Name 'x
UserForm1.ActiveControl.Name 'x
感谢任何帮助。
谢谢,
先生。 Ĵ
答案 0 :(得分:1)
Msgbox dImages.Name
适用于我/编辑
Msgbox dImages.Parent.Name
或类似的东西 - 你在dImages中引用了控件,所以你只需要从那里“向上”。
如果控件没有直接托管在表单上,那么您需要使用.Parent
“向上”,直到父级不是另一个控件:
Dim tmp As Object
Set tmp = dImages.Parent
Do While TypeOf tmp Is MSForms.Control
Set tmp = tmp.Parent
Loop
MsgBox tmp.Name
https://www.mrexcel.com/forum/excel-questions/758496-get-userform-given-control.html
答案 1 :(得分:1)
在课程模块中使用它
不要使用msgbox
,因为它会将VBA编辑器置于后台
使用Debug.Print
,然后您可以在immediate window
在debug.print行放置一个断点,然后检查dImages
中的watch window
对象(这就是我得到name
属性的方式)
Option Explicit
Public WithEvents dImages As MSForms.Image
'
Private Sub dImages_Click()
Debug.Print dImages.Name
End Sub
'
Private Sub dImages_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Debug.Print dImages.Name
End Sub