【ExcelVBA】同じコントロールイベントを共通化する

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のコード内容は、共通化前の時より大きくかわります。

テキストボックスをどれでもいいのでダブルクリック

ダブルクリックしたら、ジョセフが表示されます。お疲れ様でした。