【ExcelVBA】同じコントロールイベントを共通化する
目次
同じコントロールイベントを共通化する前の状態
まずは、共通化する前の状態を説明しておきたいと思います。UserForm1のオブジェクト
テキストボックスを3個設置テキストボックスのオブジェクト名は上から順番に
TextBox1
TextBox2
TextBox3
です。
UserForm1のコード内容
Option Explicit Private Sub UserForm_Initialize() End Sub Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) MsgBox "ジョセフ" End Sub Private Sub TextBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) MsgBox "ジョセフ" End Sub Private Sub TextBox3_DblClick(ByVal Cancel As MSForms.ReturnBoolean) MsgBox "ジョセフ" End Sub
テキストボックスをダブルクリックすることで、メッセージボックスに「ジョセフ」が表示されるようにしています。
DblClickイベントのテキストボックス1,2,3 全部同じ内容です。同じなのであれば共通化したいですよね。
とりあえず、この状態のままで話を進めていきます。
テキストボックスをどれでもいいのでダブルクリック
ダブルクリックしたら、ジョセフが表示されました。どのテキストボックスをダブルクリックしても同じ結果になります。同じコードが書かれているので当然ですよね。
同じコントロールイベントを共通化
ここからが本題です。同じコードはスリム化していきたいと思います。
Class1のコード内容
クラスモジュール「Class1」を、以下の内容にします。Option Explicit Private WithEvents TBOX As MSForms.TextBox Public Sub SetCtrl(new_ctrl As MSForms.TextBox) Set TBOX = new_ctrl End Sub Private Sub TBOX_DblClick(ByVal Cancel As MSForms.ReturnBoolean) MsgBox TBOX.Name & " ジョセフ" End Sub
テキストボックスに関連するイベントを捕捉したいので、WithEvents を用いた変数宣言をします。
「MsgBox TBOX.Name & " ジョセフ"」は、Class1 に書きます。
UserForm1のオブジェクト
先ほどの「1.1.UserForm1のオブジェクト」と同じです。フォーム画面はどこもいじっておりません。同じ物になります。
UserForm1のコード内容
Option Explicit Private myCol As Collection 'コレクション生成 Private Sub UserForm_Initialize() Set myCol = New Collection Dim myCtrl As Control 'コントロール変数の宣言 Dim myObj As Class1 'インスタンス変数の宣言 For Each myCtrl In Me.Controls If TypeName(myCtrl) = "TextBox" Then Set myObj = New Class1 'インスタンス生成 myObj.SetCtrl myCtrl 'コントロールセット myCol.Add myObj 'コレクション追加 Set myObj = Nothing 'インスタンス破棄 End If Next End Sub
UserForm1のコード内容は、共通化前の時より大きくかわります。
ディスカッション
コメント一覧
まだ、コメントがありません