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
如何 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