2017-10-23 18 views
0

mouseover 클래스 이벤트를 트리거 한 userform 컨트롤의 이름을 어떻게 반환합니까?Excel VBA 어떤 UserForm 컨트롤이 Shared 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"이라는 이름이 지정됩니다.

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가 이벤트를 트리거 컨트롤의 이름을 포함 할 수 있습니다 :

I는 각각 "클래스 1"이라는 다음 클래스 모듈에서 발견 mouseover 이벤트를 제어 지정?

Me.dImages.Name    'x 
ActiveControl.Name   'x 
Screen.ActiveControl.Name 'x  
UserForm1.ActiveControl.Name 'x 

도움을 주시면 감사하겠습니다.

감사합니다,

씨 J

답변

1

사용이 : 컨트롤이 양식에 직접 호스팅하지 않을 경우 부모가 다른 컨트롤하지 때까지

당신은 .Parent를 사용하여 "위로"이동해야합니다 클래스 모듈

이 배경

사용에 VBA 편집기를두고 있기 때문에 msgbox를 사용하지 않는 Debug.Print, 당신은 값이 (내가 name 속성을 가지고 어떻게이)

watch window에서 dImages 개체를 검토 한 다음을 Debug.Print 줄에 중단 점을 넣고 immediate window

에서 즉시 변경 볼 수 있습니다

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 
+0

나는 그것이 간단하다는 것을 알고있었습니다! 나는 이것을 시도했는지 확신했다. 즉각적인 윈도우에 대한 팁을 주셔서 감사합니다. –

1

편집 : I의 것 같아 질문을 잘못하여 읽기,하지만 나를 위해

Msgbox dImages.Name 

작품/EDIT

Msgbox dImages.Parent.Name  

또는 뭔가 그런 식으로 - 당신은 dImages에서 컨트롤에 대한 참조를 가지므로 거기에서 "위로"가야합니다. 에서

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

+0

이 컨트롤은 실제 컨트롤 자체가 아니라 사용자 폼의 이름을 반환하는 것으로 보입니다. 컨트롤 이름과는 별도로'dImages'를 사용하여 컨트롤의 모든 속성을 참조 할 수 있습니다. 앞에서 말했듯이,'.Parent'를 사용하면 계층 구조에서 사용자 폼으로 올라갑니다. –

+0

위의 편집을 참조하십시오. –