顧客管理フォームに、「条件に合致するレコードを検索する機能」を設置する:Access VBAで学ぶ初心者のためのデータベース/SQL超入門(11)(3/4 ページ)
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。今回は、「レコードの移動」「複数の条件に合致するレコードを検索する」といったレコード処理の応用テクニックを解説する。
「氏名」と「住所」に合致するレコードを検索する(あいまい検索)
レコード移動フォームにある「ID」「氏名」「性別」「年齢」「郵便番号」「住所」「電話番号」のラベルと「テキストボックス」を全てコピーし、新規作成したフォームデザイン上にペーストする。ボックス類の配置位置は適宜調整してほしい。
フォームのプロパティシートにある「レコードソース」にて、右の「v」アイコンをクリックして表示される項目より「顧客管理テーブル」を選択する。この指定を行っていないと、テキストボックス全般でデータが表示されないので忘れないようにしてほしい。
この他のテキストボックスは、レコード移動フォーム内で「コントロールソース」を指定した設定がそのままコピーされているはずなので、ここでは特に設定する必要はない。フォームデザイン画面上部の「フォーム1」のタブ上でマウスの右クリック→上書き保存する。フォーム名は「レコード検索フォーム」とする。
続いて、氏名と住所を検索するための「テキストボックスを」2個と、実行用の「ボタン」コントロールを配置する。「ラベル」「テキストボックス」「ボタン」の書式は、これまで設定してきた標準書式で構わない。
氏名テキストボックスの名前は「検索氏名テキストボックス」に、住所テキストボックスの名前は「検索住所テキストボックス」とする。同じく、ボタンの表題は「実行」とし、ボタンコントロールの名前は「実行ボタン」と指定しておく。
「レコードの先頭に戻る」ボタンも追加しておこう。もう1つボタンコントロールを配置して、表題を「先頭に戻る」、ボタンコントロールの名前を「先頭ボタン」とする。
コントロールの種類 | 名前 |
---|---|
テキストボックス | 検索氏名テキストボックス |
テキストボックス | 検索住所テキストボックス |
ボタン | 実行ボタン |
ボタン | 先頭ボタン |
レイアウトの完成形は、図7の通りだ。
実行ボタンがクリックされた時の処理
では、「実行ボタン」を押したときのコードを記述していく。
「実行ボタン」コントロールを選択した状態で、プロパティシート→「イベント」タブをクリックする。「▼」アイコンで[イベントプロシージャ]を選択し、「…」アイコンをクリックするとVBEが開き、
Private Sub 実行ボタン_Click()
End Sub
のコードが生成される。これをリスト2のコードに書き換える。
Private Sub 実行ボタン_Click() If IsNull(検索氏名テキストボックス.Value) = True Then MsgBox ("氏名が未入力です。") Exit Sub End If If IsNull(検索住所テキストボックス.Value) = True Then MsgBox ("住所が未入力です。") Exit Sub End If DoCmd.OpenForm FormName:="レコード検索フォーム", DataMode:=acReadOnly DoCmd.SearchForRecord ObjectType:=acDataForm, ObjectName:="レコード検索フォーム", Record:=acNext, WhereCondition:="[氏名] LIKE '*" & 検索氏名テキストボックス.Value & "*' AND [住所] LIKE '*" & 検索住所テキストボックス.Value & "*'" End Sub
リスト2のコードは、以下のように記述してある。
「検索氏名テキストボックス」や「検索住所テキストボックス」が未入力の場合は、警告メッセージを表示して処理を抜ける。
DoCmd.OpenFormで「レコード検索フォーム」を開く。
DoCmd.SearchForRecordで、WhereConditionにLIKE演算子を使って、検索氏名テキストボックスに入力された値と「検索住所入力テキストボックス」に入力されたデータが含まれるレコードを検索させる。DoCmd.SearchForRecordの基本書式は下記の通りだ。
- DoCmd.SearchForRecord(ObjectType:=表3の値(省略可),ObjectName:=検索するレコードの含まれるデータベースの名前(省略可),Record:=表4の値(省略可),WhereCondition:=レコードの位置を特定するための文字列(省略可))
名前 | 説明 |
---|---|
acActiveDataObject | レコードはアクティブオブジェクトに含まれる |
acDataForm | レコードはフォームに含まれる |
acDataFunction | レコードはユーザー定義関数に含まれる |
acDataQuery | レコードはクエリに含まれる |
acDataReport | レコードはレポートに含まれる |
acDataServerView | レコードはサーバビューに含まれる |
acDataStoredProcedure | レコードはストアドプロシージャに含まれる |
acDataTable | レコードはテーブルに含まれる |
(出典:Office Dev Center「AcDataObjectType 列挙 (Access)」) |
なお、今回はacDataFormを指定している。
名前 | 説明 |
---|---|
acFirst | 先頭のレコードをカレントレコードにする |
acGoTo | 指定したレコードをカレントレコードにする |
acLast | 最後のレコードをカレントレコードにする |
acNewRec | 新しいレコードをカレントレコードにする |
acNext | 次のレコードをカレントレコードにする |
acPrevious | 前のレコードをカレントレコードにする |
(出典:Office Dev Center「AcRecord 列挙 (Access)」) |
今回は、次のレコードをカレントレコードにするacNextを指定している。よって、条件を満たすレコードが複数ある場合は、「実行」ボタンをクリックするたびに順次該当するレコードが表示される動きとなる。
先頭ボタンがクリックされた時の処理
「先頭ボタン」を選択した状態で、プロパティシート→「イベント」タブをクリックする。「▼」アイコンで[イベントプロシージャ]を選択し、「…」アイコンをクリックするとVBEが開き、
Private Sub 先頭ボタン_Click()
End Sub
のコードが生成される。これをリスト3のコードに書き換える。
Private Sub 先頭ボタン_Click() DoCmd.GoToRecord , , acFirst End Sub
リスト3は、DoCmd.GoToRecord , , acFirstで先頭のレコードに移動するように記述してある。書式は以下の通りだ。
- DoCmd.GoToRecord(objectType,objectName,acRecord)
objectTypeは表3の値を指定する。省略可能だ。objectNameは、objectTypeで選択した種類のオブジェクトの有効な名前を文字列式で指定する。こちらも省略可能だ。
acRecord表4の値を指定する。今回は、acRecordの値である「acFirst」を指定して先頭のレコードに移動している。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう - Access VBAでデータ入力フォームを作り、各コントロールを追加するためのデザインビューの使い方
今回は、テーブルを基にデータ入力フォームを作成し、ラベル、テキストボックス、コンボボックス、ボタンリストボックスを追加する手順を解説する - SQLとはどういう言語か
- Accessを使うなら最低限知っておきたいSQL文を使ったさまざまな種類のクエリ操作の基本
今回は、テーブルに「SELECT文」や「BETWEEN演算子」などのSQLを入力し、データベースに蓄積したレコードを抽出する方法を解説する - 初心者でも図解で分かる! VBEの基本的な使い方とVBAプログラムの基礎文法
- Accessでフォームからデータを追加し、Excelのシートにエクスポートする
- SQLとはどういう言語か
- 数値判定、乱数発生、数値の丸めなど、数値に関する4つの関数の使い方
- 制御文で道案内
- 使うほどに良さが分かる正規表現
- .NET Frameworkがサポートする正規表現クラスを徹底活用する(前編)
- .NET Frameworkがサポートする正規表現クラスを徹底活用する(後編)