- ベストアンサー
エクセル2003 ユーザーフォームのコントロールの名前取得について
いつも勉強させていただいております。 現在、ユーザーフォームで入力画面を作成しています。 質問なのですが、コマンドボタンを押したときに その名前を取得したいのですが、そのボタンがFrameや マルチページの中にあると以下の記述では、フレームや ページの名前を返してしまうのですが、どのようにコードを 記述すればよろしいでしょうか? Private Sub CommandButton13_Click() MsgBox Me.ActiveControl.Name End Sub フレームやマルチページの中にあっても、 「CommandButton13」の名前を返す書き方 があればご指導のほどお願いいたします。 宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 コントロールの種類で場合わけし、ActiveControl の結果がコンテナ であれば、さらにその中の ActiveControl を探せば良いかと。 Private Sub CommandButton13_Click() MsgBox ActiveControlEx.Name End Sub Private Function ActiveControlEx() As Control Dim ac As Control Set ac = ActiveControl Do Select Case UCase$(TypeName(ac)) Case "FRAME" Set ac = ac.ActiveControl Case "MULTIPAGE" Set ac = ac.Pages(ac.Value).ActiveControl Case Else Set ActiveControlEx = ac Exit Do End Select Loop End Function
その他の回答 (1)
- zap35
- ベストアンサー率44% (1383/3079)
コマンドボタン名だけの表示をクラスモジュールを使ってやってみます。まず以下をユーザーフォームモジュールシートに貼り付けます Dim myCb() As Class1 Private Sub UserForm_Initialize() Dim cnt, i As Integer Dim ctrl As Control ReDim myCb(1 To UserForm1.Controls.Count) For Each ctrl In UserForm1.Controls If TypeName(ctrl) = "CommandButton" Then cnt = cnt + 1 Set myCb(cnt) = New Class1 Set myCb(cnt).opt = ctrl End If Next End Sub またこれ以下は左上のVBA Projectでシート名を右クリックし「挿入」→「クラスモジュール」で表示される画面に貼り付けて下さい(Class1という名前は変更しないこと!) Public WithEvents myCb As MSForms.CommandButton Public Property Set opt(setcb As MSForms.CommandButton) Set myCb = setcb End Property Public Property Get opt() As MSForms.CommandButton End Property Sub myCb_Click() ' コマンドボタンクリック時の動作を記述するところ MsgBox myCb.Name & " がクリックされました" & Chr(13) & _ "ActiveControlは" & UserForm1.ActiveControl.Name & "です" End Sub Userform1を表示させてコマンドボタンをクリックすると、そのオブジェクト名が表示されます。ActiveControl名も表示させていますから違いが分かると思います