2017-10-23 11 views
0

mouseoverクラスイベントをトリガしたuserformコントロールの名前を返すにはどうすればよいですか?Excel VBAどのUserFormコントロールが共有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 

私は動的に3つの画像コントロールを作成実行時には「1」、「2」、「3」という名前が付いています。

私は、それぞれが「クラス1」と呼ばれる次のクラスモジュールで見つかった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 

は、どのように私はメッセージボックスがイベントをトリガしたコントロールの名前が含まれていることができますか?

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

助けていただければ幸いです。

おかげで、

氏はJ

答えて

1

使用この:コントロールがフォーム上で直接ホストされていない場合は、親が別のコントロールでなくなるまで

あなたは.Parentを使用して「アップ」に行く必要がありますクラスモジュール

それが背景

利用されるように、VBAエディタを置くためmsgboxを使用していませんDebug.Print、その後、あなたは値がimmediate window

にその場で変更見ることができます

(それは私が name属性を得た方法である)のDebug.Print行にブレークポイントを配置し、 watch windowdImagesオブジェクトを調べます
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

編集:私の質問を誤読みのように思えるが、私/ EDIT

Msgbox dImages.Parent.Name  

か何かのため

Msgbox dImages.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'を使うと階層の上位がuserformになります。 –

+0

上記の編集を参照してください –

関連する問題