2017-10-23 1 views
0

Wie gebe ich den Namen des Benutzerformular-Steuerelements zurück, das das Mouseover-Klassenereignis ausgelöst hat?Excel VBA Welches UserForm-Steuerelement löste gemeinsam genutztes MouseOver-Klassenereignis aus?

Das klingt so einfach, aber ehrlich gesagt habe ich mein Gehirn wurde Abstich versuchen, die richtige Syntax zu finden ...

Hier ist mein Userform-Modul:

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 

ich drei Bild Steuerelemente dynamisch erstellen zu Laufzeit mit dem treffenden Namen "1", "2" und "3".

I zuweisen jeweils ein Mouseover-Ereignissteuerung in der folgenden Klasse-Modul gefunden „Class1“ genannt:

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 

Wie kann ich die MsgBox machen den Namen der Steuerung enthalten, die das Ereignis ausgelöst hat?

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

Jede Hilfe wird geschätzt.

Danke,

Herr J

Antwort

1

Verwendung dieses in der Klassenmodul

nicht verwenden msgbox, weil sie den Hintergrund Editor in VBA setzt

Einsatz Debug.Print, dann können Sie die Werte beobachten on the fly in den immediate window

ändern, um einen Haltepunkt an dem debug.print Spiel setzen und dann prüfen, das dImages Objekt in den watch window (das ist, wie ich das name Attribut bekam)

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

Ich wusste, es wäre einfach! Ich war mir sicher, dass ich das versucht habe ... Danke für deinen Tipp über das unmittelbare Fenster, ich muss es öfter benutzen. –

1

EDIT: scheint, wie ich falsch lesen Sie Ihre Frage, aber

Msgbox dImages.Name 

Werke für mich/EDIT

Msgbox dImages.Parent.Name  

oder etwas so - Sie haben einen Bezug zum Steuerelement in dImages, also müssen Sie nur von dort nach oben gehen.

Wenn die Steuerung nicht direkt auf dem Formular gehostet wird, dann müssen Sie gehen „up“ mit .Parent, bis die Eltern nicht eine andere Steuerung ist:

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

Dies scheint nur den Namen des Benutzerformulars zurückzugeben, zu dem das Steuerelement gehört, nicht das eigentliche Steuerelement selbst. Ich kann auf alle Eigenschaften des Steuerelements verweisen, indem ich 'dImages' neben dem Steuerelementnamen verwende. Wie Sie gesagt haben, geht die Verwendung von '.Parent' in der Hierarchie eine Stufe höher als die Benutzerform. –

+0

Siehe meine Bearbeitung oben –

Verwandte Themen