作成日 2005/4/16
最終更新日 2005/10/22
3.VBEのメニューに追加したボタンを押した時に処理を走らせるには
 追加したボタンをクリックしたときに処理をさせる方法ですけど、『OnActionプロパティを設定する』のはダメでした。
なんでダメなんだろう。
 (仕様という気がする。なぜなら、VBIDEにCommandBarEventsというクラスがあって、そのクラスに
Clickイベントがあるからだ。)
 ということで、CommandBarEventsクラスを使って、追加したボタンを押したときに処理が走るようにする方法をいい加減に説明します。
(※ここにあるコードとダウンロードのページにある
ヘッダコメントの挿入アドインのコードとはちょっと違います。)
 
  
  
 「CommandBarEventsクラスの使い方はヘルプに載っているので、それを見て。」って言いたいんだけど、あのヘルプじゃ無理だ。
 CommandBarEventsクラスのClickイベントの使用例を見たけど、わかりにくいと思う。
 とりあえず、下のソースをクラスモジュール(クラス名はClass1とする)に打ってくれ。
    
    
      
        
          | Class1
(クラスモジュール) 
 | 
        
          | Option Explicit
          '暗黙の型宣言の禁止(バグを発生しにくくするため) 
 'プライベートフィールドの宣言
 Private WithEvents m_CBE As CommandBarEvents
 
 '初期化メソッド
 'このクラスのインスタンス生成後、すぐに呼んで。
 'JavaやVB.Netではコンストラクタに初期化処理を書くんだけど、VBAではコンストラクタ(≒Initializeイベントプロシージャ)に引
数を持たせられないから、こういう形にした。
 Public Sub InitializeInstance(ByVal cbc As
CommandBarControl)
 Set m_CBE =
Application.VBE.Events.CommandBarEvents(cbc)
 End Sub
 
 'ボタンがクリックされた時の処理
 Private Sub m_CBE_Click(ByVal CommandBarControl As
Object, handled As Boolean,
CancelDefault As Boolean)
 Debug.Print "Click" 'イミディエイトウインドウに"Click"という文字列を出力
 End Sub
 
 | 
      
    
     
    
 で、2、メニューにボタンを追加するにはで修正してきたコードに対してさらに修正を加えま
す。(太赤文字になっているヶ所が修正ヶ所です。)
    
    
      
        
          | Module5
(標準モジュール) 
 | 
        
          | Option Explicit 
 Private m_CBB As CommandBarControl
 Private m_Cls1 As Class1
 
 Sub addButton()
 '
 ' マクロ1 Macro
 ' マクロ記録日 : 2005.4.9  ユーザー名 : 宮崎 崇
 '
 
 '
 Set m_CBB =
Application.VBE.CommandBars("標準").Controls.Add(Type:=msoControlButton,
Id _
 :=1, Before:=1)
 m_CBB.FaceId = 444
 
 
 Set m_Cls1 = New Class1
 Call m_Cls1.InitializeInstance(m_CBB)
 
 End Sub
 
 Sub deleteButton()
 Set m_Cls1 = Nothing
 Call m_CBB.delete
 End Sub
 
 
 | 
      
    
     
 適当に修正したところの説明を適当にします。
    
      - Private m_Cls1 As Class1:プライベートフィールド(モジュールレベルの変数)の宣言。
 addButtonクラスで生成するClass1クラスのインスタンスへの参照を保持する。
 
- Set m_Cls1 = New
Class1:Class1のインスタンスを生成し、そのインスタンスへの参照をプライベートフィールドm_Cls1に代入。
 
- Call
m_Cls1.InitializeInstance(m_CBB):m_Cls1が指し示しているインスタンスに対して、インスタンスメソッド
InitializeInstanceを実行している。
- Set m_Cls1 = Nothing:プライベートフィールドm_Cls1がどのインスタンスも参照しなくなる。
 ちなみに、今までm_Cls1が指し示したインスタンスは、これでどこからも参照されない状態になり、インスタンスが破棄されます。
 で、実行すると下のようになった。(イミディエイトウインドウの位置をずらした状態でハードコピーをとりました)
    
    
    
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メールをお願いします。
Microsoft 、Windows 、Visual Basic 、Microsoft Office および
Excel
は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。