Calender
Sun Mon Tue Wed Thu Fri Sat
1234567
891011121314
15161718192021
22232425262728
293031    
<< January 2017 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< 本屋にて、、 | main | 【スーパー銭湯】湯吉郎_愛知県清須 >>
【VBA】Excelでイベントハンドラを共通化
 Excel-vbaですが、コマンドボタンを沢山配置したシートでボタン押下処理などのイベント関数を共通化したい場合がありますが、シートにWithEventsを付与したクラス変数を実装することで可能です。

・「設定ボタン」で全てのコマンドボタンにClass1:btn_click()関数を実行

サンプルダウンロード→excel_shared_event.xls
・Sheet1
Option Explicit
'イベントフック用クラス
Dim mybutton(50) As Class1

Private Sub CommandButton1_Click()
  Dim btn As CommandButton
  Dim i As Integer
  
  MsgBox ActiveSheet.OLEObjects.Count & " 個のオブジェクトがあります"
  
  For i = 1 To ActiveSheet.OLEObjects.Count
    '参照を取得
    Set btn = ActiveSheet.OLEObjects(i).Object
    
    '設定ボタンのイベントは書き換えません
    If btn.Caption <> "設定" Then
      btn.BackColor = CommandButton1.BackColor
      
      'インスタンスを生成します
      Set mybutton(i) = New Class1
      'クラスのプロパティに代入
      Set mybutton(i).btn = btn
    End If
  Next

End Sub

・Class1
Option Explicit

'コマンドボタン実体のプロパティ(イベント取り用)
Public WithEvents btn As CommandButton

'実際のbtnの共通ルーチン
Private Sub btn_Click()

  'MsgBox btn.Name & " - " & btn.Caption
  '色でも変えてみるかな、、
  btn.BackColor = RGB(120 + Rnd() * 125, 120 + Rnd() * 125, 120 + Rnd() * 125)
  
End Sub

 実際にはボタン自体もクラスコンストラクタで動的に生成したほうがスマートかもしれません、その場合OLEObjectsを利用します、この辺はVBヘルプに詳しく書いてあります。
 ただエクセルVBのクラスはコンストラクタに引数が渡せないしょぼい仕様だったような、、
| 開発関連 | 13:54 | comments(3) | trackbacks(0) |
管理者の承認待ちコメントです。
| - | 2010/07/26 11:01 AM |
管理者の承認待ちコメントです。
| - | 2010/07/27 5:33 AM |
サンプルダウンロードのファイルがありませんと表示されました。
| あああ | 2015/03/11 12:09 PM |









http://blog.jojo.jp/trackback/1344588