• ベストアンサー

エクセル2003 ユーザーフォームのコントロールの名前取得について

いつも勉強させていただいております。 現在、ユーザーフォームで入力画面を作成しています。 質問なのですが、コマンドボタンを押したときに その名前を取得したいのですが、そのボタンがFrameや マルチページの中にあると以下の記述では、フレームや ページの名前を返してしまうのですが、どのようにコードを 記述すればよろしいでしょうか? Private Sub CommandButton13_Click() MsgBox Me.ActiveControl.Name End Sub フレームやマルチページの中にあっても、 「CommandButton13」の名前を返す書き方 があればご指導のほどお願いいたします。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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)
回答No.1

コマンドボタン名だけの表示をクラスモジュールを使ってやってみます。まず以下をユーザーフォームモジュールシートに貼り付けます 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名も表示させていますから違いが分かると思います

関連するQ&A