【簡単解説】VBA クラスモジュール 3実践 ユーザーフォームでの活用 2021.06.29
今回はユーザーフォームのコントロールとクラスモジュールの連携についてです。
内容
●ユーザーフォームでの活用
・複数のコントロール共有のイベント作成
・サンプルコード
サンプルファイル
記事に載せてあるコードサンプルのファイル ダウンロード
Excelマクロ管理ツール
ユーザーフォームでの活用
複数のコントロール共有のイベント作成
今回は、ユーザーフォームに16のLabelコントロールを配置し、イベントを共有させる。
Labelの名前はLabel1~16で、それぞれ名前と同じ番号がCaptionプロパティに設定され表示されている。
モジュールは次の3つを使用している。
・クラスモジュール
・標準モジュール
・フォームモジュール
それぞれに記述のコードは次である。
'宣言セクション ユーザーフォームのラベル型変数を Private WithEvents myLabel As MSForms.Label 'イベントに応答するタイプで宣言
Public Property Get Label() As MSForms.Label 'ラベル取得用プロパティ Set Label = myLabel End Property
Public Property Let Label(newLbl As MSForms.Label) 'ラベル設定用プロパティ Set myLabel = newLbl End Property
Private Sub myLabel_Click() 'Class1共有のmyLagelクリックイベント Dim n As Long, s As String n = CLng(myLabel.Caption) 'ラベルに表示されている値を取得 If n Mod 2 = 1 Then s = "奇数" Else s = "偶数" MsgBox CStr(n), vbInformation, s End Sub
Sub Form_Show() UserForm1.Show End Sub
'宣言セクション Private objLabel(1 To 16) As New Class1 '「Class1」はクラスモジュール名
Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 16 'フォームのラベルをClass1のインスタンスにセット objLabel(i).Label = Me.Controls("Label" & i) Next End Sub
上記コードのクラスモジュールにあるようなWithEventsを伴う変数は、イベントに応答する。
イベントの種類は型で宣言したオブジェクトによる。今回のケースでは、MSForms.Label型なので、フォームのLabelイベントは全て利用できる。
利用できるイベントはリストボックスで確認できる。
標準モジュールの「Form_Show」を実行すると、ユーザーフォームのインスタンスが生成され表示される。
フォームのインスタンスが生成されるタイミングで、UserForm_Initializeイベントが発生し、Class1の各インスタンスのLabel型変数にフォーム上のLabelがセットされる。
フォームが表示された段階で、Class1の各インスタンスとLabelは紐づいている。
Labelをクリックすると、クリックされたLabelに対応するインスタンスのmyLabel変数がイベントを受けとり、myLabel_Clickイベントが発生する。
どのLabelが押されたかの判定は、myLabelのプロパティを確認することで行える。
下図は、フォームのLabel6をクリックした場面である。
今回、フォームモジュールに、クラスを破棄するコードを記述していないが、フォームを閉じるとクラスは自動的に破棄される。