• ベストアンサー

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

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

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >   MsgBox CommandButton1.Caption いったい、どこのボタンか判別がつきにくいです。コマンドボタンやラベルは、いくつか種類のものがあるからです。 >コマンドボタンやラベルの自分自身の情報を得る汎用的な方法はないでしょうか。 コントロールツールの場合は、ありません。 必要なら、インスタンスを設けるしかないと思いますが、あまり実務的ではありませんね。ただ、通常、入力の際には、インテリセンスがありますから、その入力自体の問題はないと思いますが。 #1 さんのActiveControl は、UserFormだけのものだと思います。 コントロールツールの場合: '---------------------------------------------------- '標準モジュール Private myCol As Collection Sub Auto_Open()  Call myButtonClass_Setting End Sub Sub myButtonClass_Setting()   Dim objOLE As Object   Dim i As Integer   Dim myClass As Class1   Set myCol = New Collection      For Each objOLE In ThisWorkbook.Worksheets("Sheet1").OLEObjects     If TypeOf objOLE.Object Is MSForms.CommandButton Then       Set myClass = New Class1       Set myClass.myBtn = objOLE.Object       myCol.Add myClass     End If   Next End Sub 'Class1 Public WithEvents myBtn As MSForms.CommandButton Private Sub myBtn_Click()    MsgBox myBtn.Caption End Sub '---------------------------------------------------- 'なお、フォーム・ツールですと、Application.Caller が使えます。 '標準モジュール Sub MyFormButton_Click()   MsgBox ActiveSheet.Shapes(Application.Caller).Name End Sub '----------------------------------------------------

believe_me
質問者

お礼

回答ありがとうございます。 シートにボタンをつけています。 簡単にできる方法を探していたのですが、かなり面倒ですね。 その都度、ボタン名、ラベル名を書く方が簡単なようですね。 エクセルはボタンやラベルにコードを設定できてハイパーカードに良く似ていると思っていましたが、そこまでオブジェクト化されていないようですね。 大昔68030の時代マックでエクセル(VBAではありませんでした)とハイパーカードを良く利用していました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > CommandButton1と書かずに自分自身を指定する方法はないでしょうか? Me キーワードはモジュール(主に Form、Class、Sheet)自信の代替として 使用します。コントロールのレベルで Me に相当するようなキーワードは VB には用意されていないと思います。 私見ですが、その必要性を感じません。なぜなら、コードの可読性が著しく 損なわれそうな気がするからです。 ご質問の背景として考えられそうな点から回答すると... ▼コントロールの名前を入力するのが面倒  コントロールの名前を CB1 とでも短いものにすれば良いのでは?  あるいは、例えば Com まで入力してから、[Ctrl] + [Space] で VBE の  入力補完機能を使えば手間は省けますよ。 ▼プロシージャに汎用性を持たせたい(共通化したい)  サブプロシージャを設けて、引数で渡せば良いのでは? Private Sub CommandButton1_Click()   Call Test(CommandButton1) End Sub Private Sub CommandButton2_Click()   Call Test(CommandButton2) End Sub ' // サブプロシージャ Private Sub Test(ByVal Cb As MSForms.CommandButton)   MsgBox Cb.Caption End Sub ご参考までに。

believe_me
質問者

お礼

回答ありがとうございます。 実は既にサブモジュールは使っております。 ただし呼び出し側でCaptionをストリングに取り出してサブモジュールに渡していました。 回答していただいた方法の方が、よりすっきりしますね。

すると、全ての回答が全文表示されます。
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

こんにちは。 こんなのとか? Private Sub CommandButton1_Click() MsgBox ActiveControl.Caption End Sub

believe_me
質問者

お礼

あのう・・・ コマンドボタンを作りそこに教えていただいたコードをいれて 実行すると次のエラーがでますが、そちらでは問題なく動いた のでしょうか? 実行時エラー'424': オブジェクトが必要です。

すると、全ての回答が全文表示されます。

関連するQ&A