フレームはフレーム内に配置したコントロールをグループ化するコントロールだ。
本稿の場合はラベルとボタンがフレームによってグループ化されている。
今回は使用していないが、グループ化してフレームにデフォルトで指定されているオブジェクト名である「Frame1」を使って、そのフレームの[Visible]プロパティにTrueまたはFalseを指定するだけで、フレームに配置しているコントロールの表示/非表示を一括して切り替えられる。
フレームでグループ化していないと、各コントロールに1つずつ[Visible]プロパティの値を指定していく必要があり、効率が悪い。
今回は、単に「カード表示」という分類分けでフレームを使用しているだけにすぎない。
以上で「データ検索」のフォームは完成だ、次はいよいよVBAのコードを書いていこう。
UserForm2内にマクロを書いていく。UserForm2を選択しマウスの右クリックで表示される「コードの表示」で、コード画面が表示される。この中にコードを書いていく。
今回の検索VBAで一番面倒なのは、各検索用のボタンをクリックしたときに、各該当するデータを「ラベル」の中にカード形式で表示させるところだろうと思う。その他に関しては特別難しいコードは使用していない。
まず、取得した行番号の値を格納するInteger型変数「Index」を宣言する。次に、行番号を格納するLong型変数「lastRow」を宣言する。
次に、Integer型変数「判定」を宣言しておく。この「判定」変数は、「氏名オプションボタン」「住所オプションボタン」「電話オプションボタン」の中のどれをクリックしたかの判定に使用する変数だ。
「判定」への値の格納は後ほど「その他のコントロールのイベント処理とフラグの設定」で説明する。また、「判定」に格納された値によって処理が変わる部分は『「一覧リストボックス」から値を選択したときの処理』で解説する。
VBAに限らず、プログラミングではこのように処理を分岐させるための変数を「フラグ」と呼ぶ。最近では「フラグが立った」という使い方で一般的になってきた、あの「フラグ」だ。
単体のマクロを作るときはあまり必要ないが、前回からの応用編で作っている複数の機能を持つような手の込んだマクロではよく使われるので、覚えていて損はないだろう。
ここからは、各イベント処理について解説する
まずは、フォームがアクティブになったときの処理だ(リスト1)。
Private Sub UserForm_Activate() If flag = True Then 削除ボタン.Visible = True Else 削除ボタン.Visible = False End If Worksheets("個人情報データ").Activate End Sub
「パブリックモジュールレベル」で宣言したブール型変数「flag」でIf〜Elseの条件分岐を行う。パブリックモジュールレベルについては、連載第3回「マクロが動かない原因の見つけ方とVBAの変数、データ型」の「パブリックモジュールレベル」での変数の宣言を参照してほしい。
「パブリックモジュールレベル」変数は「Module1」内で、以下のように宣言されており、Publicを使用しているので、全てのモジュールから参照が可能だ。
Public flag As Boolean
Module1内のその他のマクロは後の連載で解説する。この「データ検索」フォームと、次回作成する「データ削除」フォームは、この「データ検索」フォームを共有している。
そこで、ブール型変数「flag」がTrueの場合、つまり「データ削除」メニューをクリックしたときは「削除」ボタンを表示させ、それ以外の場合、つまり前回の「データ入力」のときには「削除」ボタンは表示させないようにしているのだ。
「flag」は「データ検索」「データ削除」処理の切り替えを行う、アプリ全体用のフラグ変数だ。
最後に「個人情報データ」シートをアクティブにしている。
次は、「メニュー」ボタンをクリックしたときの処理だ(リスト2)。
Private Sub メニューボタン_Click() Worksheets("メニュー").Select UserForm2.Hide End Sub
後の連載で作成する「メニュー」シートに表示したメニュー画面を表示させる。開いていた「データ検索」フォームはHideメソッドで隠す。
Copyright © ITmedia, Inc. All Rights Reserved.