こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

コマンドボタンやラベルの自分自身の情報を得る汎用的な方法はないでしょうか。
例えばCommandButton1のCaptionを表示する場合、以下のようにコーディングしています。

Private Sub CommandButton1_Click()
   MsgBox CommandButton1.Caption
End Sub

CommandButton1.Captionと書いておりますが、CommandButton1と書かずに自分自身を指定する方法はないでしょうか?
遥か昔マッキントッシュのハイパーカードでは、自分自身の名称を得る時に「name of me」で可能でしたが、このmeに相当するものはエクセルではどのようになるのでしょうか?
よろしくお願い申し上げます。

投稿日時 - 2007-01-24 20:39:44

QNo.2693184

困ってます

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

こんばんは。

>   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

'----------------------------------------------------

投稿日時 - 2007-01-25 00:18:01

お礼

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

投稿日時 - 2007-01-25 00:48:01

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

ご参考までに。

投稿日時 - 2007-01-25 08:31:03

お礼

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

投稿日時 - 2007-01-25 23:20:51

ANo.1

こんにちは。

こんなのとか?

Private Sub CommandButton1_Click()
MsgBox ActiveControl.Caption
End Sub

投稿日時 - 2007-01-24 23:25:39

お礼

あのう・・・
コマンドボタンを作りそこに教えていただいたコードをいれて
実行すると次のエラーがでますが、そちらでは問題なく動いた
のでしょうか?

実行時エラー'424':
オブジェクトが必要です。

投稿日時 - 2007-01-25 00:08:48

あなたにオススメの質問