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 window
中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
编辑:似乎我错读你的问题,但
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