概要
備忘です。
メインフォーム側でサブフォームのイベントを検知したい人におすすめの記事。
現状
メインフォーム側に予定登録フォーム(単票フォーム)。
サブフォームに予定が入っていない人の一覧(データシートor帳票フォーム/F_未定者一覧)。
やりたいこと
F_未定者一覧の担当をダブルクリックしたら予定登録の「行く人」にその担当の名前を入れたい。
F_未定者一覧の日付をダブルクリックしたら予定登録の「行きたい日」にその日付を入れたい。
(サブフォームのダブルクリックイベントを受け取ってメインフォームのテキストボックスに張り付ける。)
方法
サブフォーム側(F_未定者一覧)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'ダブルクリックイベントを作る(定義/宣言)。 Public Event DoubleClick(ByVal Ctr As TextBox) '担当テキストボックスをダブルクリックしたら動く Private Sub 担当_DblClick(Cancel As Integer) Call DblClick End Sub '日付テキストボックスをダブルクリックしたら動く。 Private Sub 日付_DblClick(Cancel As Integer) Call DblClick End Sub Private Sub DblClick() 'イベントを発生させる。 'メインフォーム側でDoubleClickイベントが書かれた時のみ動く。 RaiseEvent DoubleClick(ActiveControl) end sub |
メインフォーム側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'サブフォーム(変数)のイベントの受け皿。 '変数名をSubFormにして型にサブフォームにすることで、SubForm_(イベント名)でサブフォームのイベントを受け取れる。 'New は使えないため、Form_Loadイベントでサブフォームをセットする。 Private WithEvents SubForm As Form_F_未定者一覧 Private Sub Form_Load() Set SubForm = Me.F_未定者一覧.Form End Sub 'サブフォーム側でDoubleClickイベントが発生したら動く(RaiseEvent)。 Private Sub SubForm_DoubleClick(ByVal Ctr As TextBox) Select Case Ctr.Name Case "日付": Me.行きたい日 = Ctr.Value Case "担当": Me.行く人 = IIf(IsNull(Me.行く人) Or Me.行く人 = "", "", Me.行く人 & "・") & Ctr.Value End Select End Sub |
メリット
・コードが簡潔
・メインフォーム側にイベントを作る必要がない(Form_Loadを除く)
・サブフォームからメインフォームの存在が気にならない
デメリット
・サブフォームのイベント名が変わってもエラーにならず気づかない(静的)
---コメント---