頭の体操! 条件分岐とループでデータ検索を実装できる?フラグの使い方の基本も:Excelマクロ/VBAで始める業務自動化プログラミング入門(14)(2/4 ページ)
プログラミング初心者を対象にExcelマクロ/VBAを使った業務自動化プログラムの作り方を一から解説します。前回から応用編として実用的なExcelアプリの作り方を解説しています。今回は、データ処理のキモとなる「検索」をマクロで実装してみましょう。頭の体操に打ってつけですよ【Windows 10、Excel 2016に対応】。
コントロールをグループ化するコントロール「フレーム」
フレームはフレーム内に配置したコントロールをグループ化するコントロールだ。
本稿の場合はラベルとボタンがフレームによってグループ化されている。
今回は使用していないが、グループ化してフレームにデフォルトで指定されているオブジェクト名である「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
パブリックモジュールレベルでアプリ全体用のフラグを設定しておく
「パブリックモジュールレベル」で宣言したブール型変数「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
後の連載で作成する「メニュー」シートに表示したメニュー画面を表示させる。開いていた「データ検索」フォームはHideメソッドで隠す。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Excelマクロ/VBAリファレンス用途別・キーワード別一覧超まとめ
- ピボットテーブルとは何か──「そもそも、何をする機能か」を理解する
Excelを通じて「ピボットテーブル」の基礎を学び、データ分析を実践するまでを習得する本連載。初回はピボットテーブルの基礎と、「どんなことができるのか」を解説する。 - どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう。