頭の体操! 条件分岐とループでデータ検索を実装できる?フラグの使い方の基本もExcelマクロ/VBAで始める業務自動化プログラミング入門(14)(2/4 ページ)

» 2016年10月17日 05時00分 公開
[薬師寺国安PROJECT KySS]

コントロールをグループ化するコントロール「フレーム」

 フレームはフレーム内に配置したコントロールをグループ化するコントロールだ。

 本稿の場合はラベルとボタンがフレームによってグループ化されている。

 今回は使用していないが、グループ化してフレームにデフォルトで指定されているオブジェクト名である「Frame1」を使って、そのフレームの[Visible]プロパティにTrueまたはFalseを指定するだけで、フレームに配置しているコントロールの表示/非表示を一括して切り替えられる。

 フレームでグループ化していないと、各コントロールに1つずつ[Visible]プロパティの値を指定していく必要があり、効率が悪い。

 今回は、単に「カード表示」という分類分けでフレームを使用しているだけにすぎない。

 以上で「データ検索」のフォームは完成だ、次はいよいよVBAのコードを書いていこう。

UserForm2内にマクロを書いていく

 UserForm2内にマクロを書いていく。UserForm2を選択しマウスの右クリックで表示される「コードの表示」で、コード画面が表示される。この中にコードを書いていく。

検索VBAのキモ

 今回の検索VBAで一番面倒なのは、各検索用のボタンをクリックしたときに、各該当するデータを「ラベル」の中にカード形式で表示させるところだろうと思う。その他に関しては特別難しいコードは使用していない。

行番号を格納する2つの変数

 まず、取得した行番号の値を格納する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
リスト1 フォームがアクティブになったときの処理

パブリックモジュールレベルでアプリ全体用のフラグを設定しておく

 「パブリックモジュールレベル」で宣言したブール型変数「flag」でIf〜Elseの条件分岐を行う。パブリックモジュールレベルについては、連載第3回「マクロが動かない原因の見つけ方とVBAの変数、データ型」の「パブリックモジュールレベル」での変数の宣言を参照してほしい。

 「パブリックモジュールレベル」変数は「Module1」内で、以下のように宣言されており、Publicを使用しているので、全てのモジュールから参照が可能だ。

Public flag As Boolean

 Module1内のその他のマクロは後の連載で解説する。この「データ検索」フォームと、次回作成する「データ削除」フォームは、この「データ検索」フォームを共有している。

 そこで、ブール型変数「flag」がTrueの場合、つまり「データ削除」メニューをクリックしたときは「削除」ボタンを表示させ、それ以外の場合、つまり前回の「データ入力」のときには「削除」ボタンは表示させないようにしているのだ。

 「flag」は「データ検索」「データ削除」処理の切り替えを行う、アプリ全体用のフラグ変数だ。

Activateメソッドでシートをアクティブに

 最後に「個人情報データ」シートをアクティブにしている。

「メニュー」ボタンをクリックしたときの処理

 次は、「メニュー」ボタンをクリックしたときの処理だ(リスト2)。

Private Sub メニューボタン_Click()
  Worksheets("メニュー").Select
  UserForm2.Hide
End Sub
リスト2 「メニュー」ボタンをクリックしたときの処理

 後の連載で作成する「メニュー」シートに表示したメニュー画面を表示させる。開いていた「データ検索」フォームはHideメソッドで隠す。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。