• ベストアンサー

自身のコントロール名を取得するコード エクセル

シート上のアクティブエックスコントロールのコマンドボタンで、 自身のコントロール名を取得するコードを押してください。 Private Sub CommandButton1_Click() MsgBox Me.ActionControl.Name End Sub だと、エラーになってしまいます。 「CommandButton1」を返したいです

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.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

参考URL:
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
EGLEDZPDEHYP
質問者

お礼

回答ありがとうございました。

その他の回答 (2)

回答No.2

ActiveXのコマンドボタンですと、ボタン個々に記述する必要があります。 クラスモジュールを利用するとお望みの動作も可能になるようなのですが、使う機会もないのでその手法は覚えようとは思いません。 「Excel VBA クラスモジュール コマンドボタン」をキーに検索してみてください。 フォームのボタンでしたら、すべてのボタンに以下を登録すればよいだけなのですが・・・ Sub Test()   MsgBox ActiveSheet.Shapes(Application.Caller).Name End Sub

EGLEDZPDEHYP
質問者

お礼

回答ありがとうございました。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

確認ですが・・・「CommandButton1をクリックした時」で良いんですよね? だとしたら単純に Private Sub CommandButton1_Click() MsgBox CommandButton1.Name End Sub で出せますよ。

EGLEDZPDEHYP
質問者

お礼

>「CommandButton1をクリックした時」で良いんですよね? そうです。 たしかに、MsgBox CommandButton1.Nameでできました! しかし説明するのを忘れてしまいましたが、 一つのコードで、どのコードでも(どのオブジェクト名でも)使えるようにしたいのです。 ActiveSheet.Nameのように。 後出しで申し訳ございません。 ご回答よろしくお願いします。