Excel VBA哪个UserForm控件触发了共享的MouseOver类事件?

时间:2017-10-23 23:13:39

标签: excel vba dynamic user-controls mouseover

如何返回触发鼠标悬停类事件的用户窗体控件的名称?

这听起来很简单,但说实话,我一直绞尽脑汁试图找到正确的语法...

这是我的用户表单模块:

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

感谢任何帮助。

谢谢,

先生。 Ĵ

2 个答案:

答案 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