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

如何返回触发mouseover类事件的用户表单控件的名称?

这听起来很简单,但老实说,我一直在试图find正确的语法,我的大脑…

这是我的用户表单模块:

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 

我在运行时dynamic地创build了三个图像控件,分别命名为“1”,“2”和“3”。

我为每个控件分配一个名为“Class1”的类模块中的mouseover事件:

 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因为它会将VBA编辑器置于后台

使用Debug.Print ,那么你可以在immediate windowimmediate window观察值的变化

在debug.print行放置一个断点,然后检查watch windowdImages对象(这就是我如何得到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 

编辑:似乎我错读你的问题,但

 Msgbox dImages.Name 

为我工作/编辑

 Msgbox dImages.Parent.Name 

或者类似的东西 – 你有一个dImages的控制参考,所以你只需要从那里“上”。

如果控件不是直接托pipe在窗体上,那么您将需要使用.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