Excel VBA 哪个用户窗体控件触发了共享的 MouseOver Class 事件?

Excel VBA Which UserForm Control Triggered Shared MouseOver Class Event?

如何 return 触发鼠标悬停 class 事件的用户窗体控件的名称?

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

这是我的用户表单模块:

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”。

我为每个控件分配了一个在以下 class 模块中找到的鼠标悬停事件,该模块名为 "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

感谢任何帮助。

谢谢,

先生J

编辑:好像我误读了你的问题,但是

Msgbox dImages.Name 

对我有用/编辑

Msgbox dImages.Parent.Name    

或类似的东西 - 你在 dImages 中有一个控件的引用,所以你只需要从那里转到 "up"。

如果控件没有直接托管在表单上,​​那么您将需要使用 .Parent "up" 直到父控件不是另一个控件:

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

在 class 模块中使用它

不要使用 msgbox,因为它会将 VBA 编辑器置于后台

使用 Debug.Print,然后您可以在 immediate window

中实时观察值的变化

在 debug.print 行放置一个断点,然后检查 watch window 中的 dImages 对象(这就是我获得 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