• ベストアンサー

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

シート上のアクティブエックスコントロールのコマンドボタンで、 自身のコントロール名を取得するコードを押してください。 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のように。 後出しで申し訳ございません。 ご回答よろしくお願いします。

関連するQ&A

  • 今発生しているイベントのコントロール名を取得

    エクセルです 例えば、シートにコマンドボタンを一つ設置して、クリックイベントで Private Sub CommandButton1_Click() MsgBox "CommandButton1が押されました" End Sub こうしたら、コマンドボタン1を押した時に、 "CommandButton1が押されました"が表示されますが、 CommandButton1の部分を変数みたいなのにすることはできますか? MsgBox Me.Name & "が押されました" だとシート名が取得されるし MsgBox Me.Control.Name & "が押されました" や MsgBox Me.ActionControl.Name & "が押されました" だとエラーになります。

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

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

  • エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタン

    エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタンについて教えてください。 実はこれまでフォームしか使ったことがないのですが、フォームのボタンですと、下記のように一つのプロシージャを多数のボタンから呼び出し、呼び出したボタンにより異なった指示が出来ます。 Sub test() x = Application.Caller Select Case x Case "ボタン 1" MsgBox 1 Case "ボタン 2" MsgBox 2 Case "ボタン 3" MsgBox 3 Case "ボタン 4" MsgBox 4 End Select End Sub コントロールツールボックスは Private Sub CommandButton1_Click() MsgBox 1 End Sub Private Sub CommandButton2_Click() MsgBox 2 End Sub のようにコマンドボタンごとにひとつずつ書くしかないのでしょうか?

  • エクセルVBAでmeに相当するものは?

    コマンドボタンやラベルの自分自身の情報を得る汎用的な方法はないでしょうか。 例えばCommandButton1のCaptionを表示する場合、以下のようにコーディングしています。 Private Sub CommandButton1_Click()    MsgBox CommandButton1.Caption End Sub CommandButton1.Captionと書いておりますが、CommandButton1と書かずに自分自身を指定する方法はないでしょうか? 遥か昔マッキントッシュのハイパーカードでは、自分自身の名称を得る時に「name of me」で可能でしたが、このmeに相当するものはエクセルではどのようになるのでしょうか? よろしくお願い申し上げます。

  • 親フォーム名を取得するには?

    フォーム1を作り、さらにフォーム2を作り、 フォーム1にはめ込んで、フォーム2をサブフォームとしました。 そのフォーム2にコマンドボタンを作成しました。 そしてそのコマンドボタンをクリックしたときに、メッセージを表示させたいのですが、 内容は 「現在のフォームの親フォームはフォーム1です」です。 Private Sub コマンド0_Click() MsgBox Me.Name & "の親フォームは " & Me.Parent & "です" End Sub だと実行時エラー450になります。

  • VBAのプロパティウィンドウについて

    VBAでプロパティウィンドウには ・Microsoft Excel Object ・フォーム ・標準モジュール があります。 ところで、下のプログラムですが、(1)の部分を標準モジュールに書き込み、フォームにあるコマンドボタンをクリックしたら、"test.xls"が表示されます。 しかし、(1)の部分をMicrosoft Excel Object のsheet1(sheet1)のコードに書き込み、プログラムを実行させると、フォームのコマンドボタンをクリックしても"test.xls"は表示されません。 これはなぜですか? (1)の部分のコマンドボタン1はsheet1に存在します。 (1)----------------------------------- Private file_name as string Private Sub CommandButton1_Click()   file_name="test.xls" UserForm1.Show End Sub (1)----------------------------------- フォーム Sub CommandButton1_Click() MsgBox file_name End Sub

  • なぜエラーになるのでしょう?アクティブコントロール

    ちょっと変なやり方かもしれないのですが、都合上こうやりたいので教えてください。 フォーム1の中にフォーム2を入れてサブフォームとして フォーム2の中にコマンドボタンを一つ置きました。 そのコマンドボタンを押した時に、そのコマンドボタン名を取得したいのですがうまくできません。 フォームは20個ぐらいあってこれと同じ動きをしたいので、 フォームモジュールには Private Sub コマンド0_Click() Call アクティブコントロール名を取得する End Sub として、 標準モジュールにコードは書いています。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name MsgBox "アクティブコントロール名" & Forms(フォーム).ActiveControl.Caption End Sub にすると、オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)になります。 そもそも、フォーム = Screen.ActiveForm.Nameの時点で、フォーム1になっています。 実際のコマンドボタンはフォーム2にあるのに。 なので、無理矢理 MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption にしたら、 実行時エラー2450 マクロの式またはVisualBasicコードで参照されている'フォーム2'が見つかりません。 という違うエラーになりました。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name Forms("フォーム2").SetFocus MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption End Sub にすればいいのかな?と思ったら Forms("フォーム2").SetFocusでアウトでした。 もともとはサブフォームのコントロールから発信したイベントなのに、 サブフォームのコントロールの値が取れないのでしょうか? 実際のmdbファイルではコマンドボタンではなくテキストです。 ご回答よろしくお願いします。

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

専門家に質問してみよう