Excelカレンダーのイベントをクラスモジュールで一括制御する

この記事は、運営しているYouTubeチャンネルで「カレンダーフォームのラベルコントロールをクラスで扱う方法を解説してほしい」というご要望をいただいて書きました!
はじめに
以前、こんな記事を書きました。
このカレンダーコントロールは日付部分が37個のラベルでできていて、37個のイベントプロシージャを作ってあります。クラスを使って省コードもできますが、導入の際にインポートするモジュールが少ない方がいいかなと思ってクラスモジュールは使いませんでした。
ですが、クラスを使ってみたいという方がいらっしゃって、質問をくださって嬉しいです! やってみたいですよね~~!!!
というわけで今回は、動画を見てもらいながら、このページのコードをコピペしてもらうつくりになっています。既存のカレンダーにクラスモジュールを追加して、元々あった37個のイベントプロシージャの機能をまるっと移植して、同じ動作をさせるまで、という流れを、しっかりめに解説しました。
前述のカレンダーを導入してから、やってみてくださいね。
コード
ここから、動画内で解説しているコピペ用のコードです。
新しく挿入したクラスモジュールはC_EventControlという名前へ変更して使ってください。
クラスモジュールへコピペするコード
作成したC_EventControlモジュールへコピーするコードです。
Private WithEvents tgtLbl As MSForms.Label 'ラベルのイベントを捕捉する宣言 Public Sub setLbl(lbl As MSForms.Label) '対象のラベルオブジェクトをセット Set tgtLbl = lbl End Sub Private Sub tgtLbl_Click() 'ラベルのクリックイベント End Sub
一番上は、このクラスでtgtLblというオブジェクトを使います、そのイベントを捕捉します、という宣言です。
真ん中のsetLblプロシージャは、宣言したtgtLblへ、具体的にどのラベルをあてはめるか? という設定です。
一番下のtgtLbl_Clickプロシージャは、このクラスで使うtgtLblのクリックイベントです。動画内でコードを書いて完成させます。最終的に以下のコードになるので、うまくいかなかった方はコピペしてみてください。
Private Sub tgtLbl_Click() 'ラベルのクリックイベント '## グローバル変数に取得した日付をセットする If tgtLbl.Caption = "" Then Exit Sub 'ラベルが空だったら中止 g_cldPickedDate = F_Calendar.cmb_year.Value & "/" & F_Calendar.cmb_month.Value & "/" & tgtLbl.Caption '日付を生成して変数に格納 Unload F_Calendar 'カレンダーを閉じる End Sub
フォーム上で選択されている年、月へ、クリックされたラベルのキャプションの数字を合わせて日付を生成しています。
フォームモジュールの宣言セクションへコピペするコード
既存のF_Calendarモジュールの冒頭、宣言セクションへコピーするコードです。
Private ec(1 To 37) As C_EventControl 'クラスを使う宣言
作成したクラスモジュールを利用するための記述です。
フォームモジュールの UserForm_Initialize へ追加するコード
既存のF_Calendarモジュールの、UserForm_Initializeプロシージャへ、以下のハイライトしてあるコードを追加します。
Private Sub UserForm_Initialize()
'## フォーム読込時
Dim i As Long '汎用変数
g_isCldCancel = False 'キャンセルフラグをFalseにしておく
For i = -3 To 3 '前後3年分の年をリストに追加
Me.cmb_year.AddItem Year(g_cldCurrentDate) + i
Next i
For i = 1 To 12 '月をリストに追加
Me.cmb_month.AddItem i
Next i
Me.cmb_year.Value = Year(g_cldCurrentDate) '年を指定
Me.cmb_month.Value = Month(g_cldCurrentDate) '月を指定
For i = LBound(ec) To UBound(ec) '配列を最初から最後まで繰り返す
Set ec(i) = New C_EventControl 'インスタンスの生成
ec(i).setLbl Me("lbl_day" & i) 'ラベルをセット
Next i
End Sub
フォームを表示するときに、クラスモジュールから37個のインスタンスを生成して、それぞれにカレンダー上のラベルをセットします。
終わりに
クラスモジュールおもしろい! と興味を持っていただけたら、昔書いた記事ですが、以下も参考になると思います。
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。





コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。