- ベストアンサー
自身のコントロール名を取得するコード エクセル
シート上のアクティブエックスコントロールのコマンドボタンで、 自身のコントロール名を取得するコードを押してください。 Private Sub CommandButton1_Click() MsgBox Me.ActionControl.Name End Sub だと、エラーになってしまいます。 「CommandButton1」を返したいです
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いろいろ検索してみましたが、耳寄りな情報はみつからないので、クラスモジュールによる方法で遊んでみました。たまに復習しないと忘れてしまうので、失礼いたします。 ワークシートにコントロールツールボックスのコマンドボタン2個と、動作確認用に別のコントロールも置いて試験しています。 クラスを2段構えにする事でプロシージャ実行→イベントに変換しています。 興味を持たれたら、参考URLをご覧下さい。 '☆シートモジュール Private WithEvents myControlCenter As controlCenter '素のクリックイベントが働いたときはインスタンスを生成する様にしてみた Private Sub CommandButton1_Click() If myControlCenter Is Nothing Then setContrlCenter End Sub Private Sub CommandButton2_Click() If myControlCenter Is Nothing Then setContrlCenter End Sub Private Sub setContrlCenter() Set myControlCenter = New controlCenter Set myControlCenter.parent = Me End Sub Private Sub myControlCenter_cmdclick(cmdName As String) 'ここでは名前を渡していますが、番号を渡して分岐とかにも出来ます MsgBox cmdName End Sub '☆ controlCenter クラス Public Event cmdClick(myName As String) Private myParent As Worksheet Private ctrlCounter As Long Private myCmdCls() As myCmdClass Private myOleObject As OLEObject Public Sub cmdClicked(myName As String) RaiseEvent cmdClick(myName) End Sub Public Property Set parent(newParent As Worksheet) Set myParent = newParent For Each myOleObject In myParent.OLEObjects If InStr(1, myOleObject.progID, "CommandButton") > 0 Then ctrlCounter = ctrlCounter + 1 ReDim Preserve myCmdCls(1 To ctrlCounter) Set myCmdCls(ctrlCounter) = New myCmdClass Set myCmdCls(ctrlCounter).parent = Me 'OleObject.Objectがミソ myCmdCls(ctrlCounter).setCmd myOleObject.Object, ctrlCounter End If Next myOleObject End Property '☆ myCmdClass クラス Private WithEvents myCmd As MSForms.CommandButton Private myIndex As Long Private myParent As controlCenter Public Sub setCmd(newControl As MSForms.CommandButton, index As Long) Set myCmd = newControl myIndex = index End Sub Private Sub myCmd_Click() Call Me.parent.cmdClicked(myCmd.Name) End Sub Public Property Set parent(newParent As controlCenter) Set myParent = newParent End Property Public Property Get parent() As controlCenter Set parent = myParent End Property
その他の回答 (2)
- misatoanna
- ベストアンサー率58% (528/896)
ActiveXのコマンドボタンですと、ボタン個々に記述する必要があります。 クラスモジュールを利用するとお望みの動作も可能になるようなのですが、使う機会もないのでその手法は覚えようとは思いません。 「Excel VBA クラスモジュール コマンドボタン」をキーに検索してみてください。 フォームのボタンでしたら、すべてのボタンに以下を登録すればよいだけなのですが・・・ Sub Test() MsgBox ActiveSheet.Shapes(Application.Caller).Name End Sub
お礼
回答ありがとうございました。
- tsubuyuki
- ベストアンサー率45% (699/1545)
確認ですが・・・「CommandButton1をクリックした時」で良いんですよね? だとしたら単純に Private Sub CommandButton1_Click() MsgBox CommandButton1.Name End Sub で出せますよ。
お礼
>「CommandButton1をクリックした時」で良いんですよね? そうです。 たしかに、MsgBox CommandButton1.Nameでできました! しかし説明するのを忘れてしまいましたが、 一つのコードで、どのコードでも(どのオブジェクト名でも)使えるようにしたいのです。 ActiveSheet.Nameのように。 後出しで申し訳ございません。 ご回答よろしくお願いします。
お礼
回答ありがとうございました。